1

目前正在为 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(Array( 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 是输出目录

4

1 回答 1

1

在将数据写入 avro 或任何格式时尝试指定数据帧的分区数。要修复此使用repartitioncoalescedf 功能。

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

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

希望这可以帮助!

于 2018-11-06T17:19:14.090 回答