如何为包含 30MB 以上数据的大型平面文件生成单个 .avro 文件
How can I generate a single .avro file for large flat file with 30MB+ data
目前正在为 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
import org.apache.spark.sql.types.{StructType, StructField, StringType}
// Manual schema declaration of the 'co' and 'id' column names and types
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")
// Note: /tmp/file.txt is input file/dir, and /tmp/avroout is the output dir
尝试在将数据写入 avro 或任何格式时指定数据帧的分区数。要解决此问题,请使用 repartition
或 coalesce
df 函数。
df.coalesce(1).write.format("com.databricks.spark.avro").save("/tmp/avroout")
所以它只写一个文件 "/tmp/avroout"
希望对您有所帮助!
目前正在为 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
import org.apache.spark.sql.types.{StructType, StructField, StringType}
// Manual schema declaration of the 'co' and 'id' column names and types 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")
// Note: /tmp/file.txt is input file/dir, and /tmp/avroout is the output dir
尝试在将数据写入 avro 或任何格式时指定数据帧的分区数。要解决此问题,请使用 repartition
或 coalesce
df 函数。
df.coalesce(1).write.format("com.databricks.spark.avro").save("/tmp/avroout")
所以它只写一个文件 "/tmp/avroout"
希望对您有所帮助!