如何将 parquet 文件复制并转换为 csv

问题描述 投票:0回答:4

我可以访问 hdfs 文件系统,并且可以使用

查看镶木地板文件
hadoop fs -ls /user/foo

如何将这些 parquet 文件复制到本地系统并将其转换为 csv 以便我可以使用它们? 这些文件应该是简单的文本文件,每行有多个字段。

python hadoop apache-spark pyspark parquet
4个回答
23
投票

尝试

df = spark.read.parquet("/path/to/infile.parquet")
df.write.csv("/path/to/outfile.csv")

相关API文档:

/path/to/infile.parquet
/path/to/outfile.csv
都应该位于 hdfs 文件系统上。您可以明确指定
hdfs://...
,也可以省略它,因为通常它是默认方案。

您应该避免使用

file://...
,因为本地文件对于集群中的每台机器来说意味着不同的文件。改为输出到 HDFS,然后使用命令行将结果传输到本地磁盘:

hdfs dfs -get /path/to/outfile.csv /path/to/localfile.csv

或者直接从HDFS显示:

hdfs dfs -cat /path/to/outfile.csv

3
投票

如果 Hive 中的这些 parquet 文件定义了一个表(或者您自己定义了这样一个表),您可以对其运行 Hive 查询并将结果保存到 CSV 文件中。尝试一些类似的事情:

插入覆盖本地目录dirname
  行格式分隔字段以“,”结尾
  从表名中选择*;

用实际值替换

dirname
tablename
。请注意,指定目录中的任何现有内容都会被删除。有关详细信息,请参阅从查询将数据写入文件系统


3
投票

更动态形式的片段,因为您可能不完全知道镶木地板文件的名称是什么,将是:

for filename in glob.glob("[location_of_parquet_file]/*.snappy.parquet"):
        print filename
        df = sqlContext.read.parquet(filename)
        df.write.csv("[destination]")
        print "csv generated"

0
投票

另一种方法是使用 sling (https://slingdata.io)。见下文。

sling run --src-stream file://path/to/file.parquet --tgt-object file://path/to/file.csv

sling run --src-stream file://path/to/parquet_folder/ --tgt-object file://path/to/file.csv

sling run --src-stream file://path/to/folder/*.parquet --tgt-object file://path/to/folder/{stream_file_name}.csv

您还可以使用 YAML/JSON 配置文件:

source: local
target: aws_s3

defaults:
  source_options:
    format: csv
  target_options:
    format: parquet

streams:
  'file://path/to/csv_folder/':
    object: path/to/file.csv

  'file://path/to/folder/*.parquet':
    object: path/to/folder/{stream_file_name}.csv
© www.soinside.com 2019 - 2024. All rights reserved.