如何为具有 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 或任何格式时,尝试指定数据帧的分区数。要解决此问题,请使用 repartitioncoalesce df 函数。

df.coalesce(1).write.format("com.databricks.spark.avro").save("/tmp/avroout")

这样它在"/tmp/avroout"中只写入一个文件

希望这会有所帮助!

【讨论】:

以上是关于如何为具有 30MB+ 数据的大型平面文件生成单个 .avro 文件的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何为测试数据生成具有唯一 id3 数据的 mp3 文件?

如何为mongodb数据库创建一个平面文件,以及如何在弹性搜索和kibana中使用该平面文件来查询数据?

新的 Firebase Firestore DocumentDb 如何为大型子集合建模

具有多个相似实体或单个大型实体的核心数据

如何为单个包生成覆盖率 xml 报告?

使用 SQL*Plus 生成和插入大型 CLOB (1 MB)