web-dev-qa-db-ja.com

PySparkでAvroファイルを読み取る方法

Pythonを使用してsparkジョブを書いています。しかし、avroファイルの束全体を読み取る必要があります。

これ は、Sparkのサンプルフォルダーで見つけた最も近いソリューションです。ただし、このpythonスクリプトをspark-submitを使用して送信する必要があります。spark-submitのコマンドラインで、ドライバークラスを指定できます。その場合、すべてのavrokey、avrovalueクラス配置されます。

avro_rdd = sc.newAPIHadoopFile(
        path,
        "org.Apache.avro.mapreduce.AvroKeyInputFormat",
        "org.Apache.avro.mapred.AvroKey",
        "org.Apache.hadoop.io.NullWritable",
        keyConverter="org.Apache.spark.examples.pythonconverters.AvroWrapperToJavaConverter",
        conf=conf)

私の場合、Pythonスクリプト内ですべてを実行する必要があります。jarファイルを含める環境変数を作成しようとしました。fingercross Python will jarをパスに追加しますが、明らかにそうではありません。予期しないクラスエラーが発生します。

os.environ['SPARK_SUBMIT_CLASSPATH'] = "/opt/cloudera/parcels/CDH-5.1.0-1.cdh5.1.0.p0.53/lib/spark/examples/lib/spark-examples_2.10-1.0.0-cdh5.1.0.jar"

誰かが1つのpythonスクリプトでavroファイルを読み取る方法を手伝ってくれる?

13
B.Mr.W.

スパーク> = 2.4.0

組み込みのAvroサポート を使用できます。 APIはspark-avroパッケージと下位互換性があり、いくつかの追加が行われています(特にfrom_avro/to_avro関数)。

モジュールは標準のSparkバイナリにバンドルされておらず、spark.jars.packagesまたは同等のメカニズムを使用してインクルードする必要があることに注意してください。

こちらもご覧ください Pyspark 2.4.0、avro from kafka with read stream-Python

スパーク<2.4.0

spark-avro ライブラリを使用できます。まず、サンプルデータセットを作成します。

import avro.schema
from avro.datafile import DataFileReader, DataFileWriter

schema_string ='''{"namespace": "example.avro",
 "type": "record",
 "name": "KeyValue",
 "fields": [
     {"name": "key", "type": "string"},
     {"name": "value",  "type": ["int", "null"]}
 ]
}'''

schema = avro.schema.parse(schema_string)

with open("kv.avro", "w") as f, DataFileWriter(f, DatumWriter(), schema) as wrt:
    wrt.append({"key": "foo", "value": -1})
    wrt.append({"key": "bar", "value": 1})

spark-csvを使用した読み取りは、次のように簡単です。

df = sqlContext.read.format("com.databricks.spark.avro").load("kv.avro")
df.show()

## +---+-----+
## |key|value|
## +---+-----+
## |foo|   -1|
## |bar|    1|
## +---+-----+ 
9
zero323

前者のソリューションでは、サードパーティのJava依存関係をインストールする必要があります。これはほとんどのものではありませんPython開発者は満足しています。しかし、実際には必要ありません必要なすべての外部ライブラリは、指定されたスキーマでAvroファイルを解析するだけです。バイナリファイルを読み取って、お好みのpython Avroパッケージで解析することができます。

たとえば、これはfastavroを使用してAvroファイルをロードする方法です。

from io import BytesIO
import fastavro

schema = {
    ...
}

rdd = sc.binaryFiles("/path/to/dataset/*.avro")\
    .flatMap(lambda args: fastavro.reader(BytesIO(args[1]), reader_schema=schema))

print(rdd.collect())
5
Régis B.