如何为具有 30MB+ 数据的大型平面文件生成单个 .avro 文件
Posted
技术标签:
【中文标题】如何为具有 30MB+ 数据的大型平面文件生成单个 .avro 文件【英文标题】:How can I generate a single .avro file for large flat file with 30MB+ data 【发布时间】:2018-11-06 01:01:45 【问题描述】:目前正在为 10 kb 文件生成两个 avro 文件,如果我对我的实际文件 (30MB+) 执行相同的操作,我将生成 n 个文件。
所以需要一个解决方案,即使源文件很大,也只生成一两个.avro文件。
还有什么方法可以避免手动声明列名。
目前的方法...
spark-shell --packages com.databricks:spark-csv_2.10:1.5.0,com.databricks:spark-avro_2.10:2.0.1
导入 org.apache.spark.sql.types.StructType, StructField, StringType
// 'co' 和 'id' 列名和类型的手动模式声明 val customSchema = StructType(数组( StructField("ind", StringType, true), StructField("co", StringType, true)))
val df = sqlContext.read.format("com.databricks.spark.csv").option("comment", "\"").option("quote", "|").schema(customSchema) .load("/tmp/file.txt")
df.write.format("com.databricks.spark.avro").save("/tmp/avroout")
// 注意:/tmp/file.txt 是输入文件/目录,/tmp/avroout 是输出目录
【问题讨论】:
对不起,我不明白:所以你有一个输入文件,你想从中生成 2 个 avro 文件(而不是你现在有的 n)。它是否正确?所以你的问题是关于如何用火花做到这一点? 【参考方案1】:在将数据写入 avro 或任何格式时,尝试指定数据帧的分区数。要解决此问题,请使用 repartition
或 coalesce
df 函数。
df.coalesce(1).write.format("com.databricks.spark.avro").save("/tmp/avroout")
这样它在"/tmp/avroout"
中只写入一个文件
希望这会有所帮助!
【讨论】:
以上是关于如何为具有 30MB+ 数据的大型平面文件生成单个 .avro 文件的主要内容,如果未能解决你的问题,请参考以下文章
我应该如何为测试数据生成具有唯一 id3 数据的 mp3 文件?
如何为mongodb数据库创建一个平面文件,以及如何在弹性搜索和kibana中使用该平面文件来查询数据?