次のようなフローでSpark(Scala APIを使用)を使用してAvroファイルを作成する一般的な方法は何ですか?
私はspark-avroを使おうとしましたが、あまり役に立ちません。
val someLogs = sc.textFile(inputPath)
val rowRDD = someLogs.map { line =>
createRow(...)
}
val sqlContext = new SQLContext(sc)
val dataFrame = sqlContext.createDataFrame(rowRDD, schema)
dataFrame.write.avro(outputPath)
これはエラーで失敗します:
org.Apache.spark.sql.AnalysisException:
Reference 'StringField' is ambiguous, could be: StringField#0, StringField#1, StringField#2, StringField#3, ...
Databricksは、Avroデータの読み取りと書き込みに役立つライブラリspark-avroを提供しました。
dataframe.write.format("com.databricks.spark.avro").save(outputPath)
Spark2およびScala 2.11
import com.databricks.spark.avro._
import org.Apache.spark.sql.SparkSession
val spark = SparkSession.builder().master("local").getOrCreate()
// Do all your operations and save it on your Dataframe say (dataFrame)
dataFrame.write.avro("/tmp/output")
Maven依存関係
<dependency>
<groupId>com.databricks</groupId>
<artifactId>spark-avro_2.11</artifactId>
<version>4.0.0</version>
</dependency>
spark Shellを起動して、avroパッケージを含める必要があります。下位バージョンに推奨されます
$ SPARK_HOME/bin/spark-Shell --packages com.databricks:spark-avro_2.11:4.0.0
次に、todfを使用してavroファイルとして書き込みます-
dataframe.write.format("com.databricks.spark.avro").save(outputPath)
そして、Hiveでavroテーブルとして記述します-
dataframe.write.format("com.databricks.spark.avro").saveAsTable(hivedb.hivetable_avro)