web-dev-qa-db-ja.com

Spark-Avroファイルを書き込む

次のようなフローでSpark(Scala APIを使用)を使用してAvroファイルを作成する一般的な方法は何ですか?

  1. hDFSからいくつかのログファイルを解析します
  2. ログファイルごとに、いくつかのビジネスロジックを適用し、Avroファイルを生成します(または複数のファイルをマージする場合もあります)
  3. avroファイルをHDFSに書き込む

私は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, ...
4
iuliandumitru

Databricksは、Avroデータの読み取りと書き込みに役立つライブラリspark-avroを提供しました。

dataframe.write.format("com.databricks.spark.avro").save(outputPath)
11
Sudheer Palyam

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>
2
Debaditya

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)
1
Spidey Praful