如何复制并将Parquet文件转换为CSV

11

我可以访问HDFS文件系统,可以看到带有Parquet文件的内容。

hadoop fs -ls /user/foo

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

3个回答

22
尝试
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

可以在HDFS文件系统中的某个位置读取infile.parquet文件吗? - Simd
是的,infile.parquet 应该是 HDFS 文件系统上的位置,outfile.csv 也是。您可以指定一个没有方案的路径,因为默认通常是 HDFS,或者您可以显式地指定 hdfs://...。应避免使用 file://...,因为本地文件对于集群中的每台机器来说都是不同的文件。相反,输出到 HDFS,然后如果确实需要,可以使用命令行将结果传输到本地磁盘。 - Zoltan

3
如果在Hive中定义了那些parquet文件的表(或者您自己定义了这样一张表),您可以在该表上运行Hive查询并将结果保存到CSV文件中。尝试以下操作:
insert overwrite local directory dirname
  row format delimited fields terminated by ','
  select * from tablename;
请使用实际值替换dirnametablename。请注意,指定目录中的任何现有内容都将被删除。有关详细信息,请参见从查询中将数据写入文件系统

谢谢。我从未使用过Hive。我可以从命令行运行Hadoop,也安装了Spark。 - Simd

3

为了创建更加动态的表单,因为您可能不知道Parquet文件的确切名称,可以使用以下代码片段:

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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接