将HDFS中的Parquet文件转换为CSV并复制到本地的方法咨询
我来帮你搞定把HDFS上的Parquet文件转成CSV并下载到本地的问题~
首先得说清楚:你之前用的hadoop fs -text和copyToLocal命令为什么行不通——Parquet是二进制列式存储格式,不是纯文本文件:
hadoop fs -text只能解析SequenceFile、TextFile这类文本相关的格式,直接读Parquet会输出乱码或者不可识别的二进制内容;copyToLocal只是把HDFS上的原Parquet文件下载到本地,你得到的media1.csv其实还是Parquet格式,只是改了后缀名而已,自然没法用CSV阅读器打开。
下面给你两种最常用的靠谱方案,按需选择:
方案1:用Spark转换(推荐,高效灵活)
Spark对Parquet的支持非常完善,不管是交互式操作还是批量任务都很方便。
方式一:交互式spark-shell操作
- 先启动spark-shell:
spark-shell
- 在Spark Shell里执行Scala代码完成转换:
// 读取HDFS上的Parquet文件 val parquetDF = spark.read.parquet("/user/Current_Data/partitioned_key=MEDIA/000000_0") // 把数据写入本地的CSV目录(加header参数会把列名作为CSV表头,不需要可以去掉) parquetDF.write.option("header", "true").csv("/home/oozie-coordinator-workflows/quality_report/media_csv_temp")
- Spark会生成多个
part-*开头的CSV文件,用cat合并成单个文件:
cat /home/oozie-coordinator-workflows/quality_report/media_csv_temp/part-* > /home/oozie-coordinator-workflows/quality_report/media.csv
方式二:用spark-submit运行Python脚本(适合定时/批量任务)
写一个简单的Python脚本(比如parquet_to_csv.py):
from pyspark.sql import SparkSession if __name__ == "__main__": # 初始化Spark会话 spark = SparkSession.builder.appName("Parquet2CSV").getOrCreate() # 读取HDFS上的Parquet文件 df = spark.read.parquet("hdfs:///user/Current_Data/partitioned_key=MEDIA/000000_0") # 写入CSV到本地,mode("overwrite")会覆盖已存在的目录 df.write.option("header", "true").mode("overwrite").csv("/home/oozie-coordinator-workflows/quality_report/media_csv_temp") # 关闭Spark会话 spark.stop()
然后提交运行:
spark-submit --master local[*] parquet_to_csv.py
之后同样用cat命令合并分区文件即可。
方案2:用Hive转换(适合已有Hive环境的场景)
如果你的集群已经部署了Hive,也可以通过Hive表来完成格式转换:
- 启动Hive CLI:
hive
- 创建一个临时外部表,指向HDFS上的Parquet文件路径:
CREATE EXTERNAL TABLE temp_parquet_table STORED AS PARQUET LOCATION '/user/Current_Data/partitioned_key=MEDIA/000000_0';
- 把表数据导出到本地的CSV目录:
INSERT OVERWRITE LOCAL DIRECTORY '/home/oozie-coordinator-workflows/quality_report/media_csv_temp' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE SELECT * FROM temp_parquet_table;
- 合并生成的文件到最终CSV:
cat /home/oozie-coordinator-workflows/quality_report/media_csv_temp/* > /home/oozie-coordinator-workflows/quality_report/media.csv
- 最后可以删除临时表清理环境:
DROP TABLE temp_parquet_table;
总结一下:处理Parquet这种结构化二进制格式,必须用支持它的工具(Spark/Hive)来解析并转换格式,直接用HDFS的基础命令是行不通的~
内容的提问来源于stack exchange,提问作者user3890017
相关产品推荐
相关产品推荐

