我可以访问 hdfs 文件系统,并且可以使用
查看镶木地板文件hadoop fs -ls /user/foo
如何将这些 parquet 文件复制到本地系统并将其转换为 csv 以便我可以使用它们? 这些文件应该是简单的文本文件,每行有多个字段。
尝试
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
如果 Hive 中的这些 parquet 文件定义了一个表(或者您自己定义了这样一个表),您可以对其运行 Hive 查询并将结果保存到 CSV 文件中。尝试一些类似的事情:
插入覆盖本地目录dirname 行格式分隔字段以“,”结尾 从表名中选择*;
用实际值替换
dirname
和 tablename
。请注意,指定目录中的任何现有内容都会被删除。有关详细信息,请参阅从查询将数据写入文件系统。
更动态形式的片段,因为您可能不完全知道镶木地板文件的名称是什么,将是:
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"
另一种方法是使用 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