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ファイルを読み取る方法を手伝ってくれる?
スパーク> = 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|
## +---+-----+
前者のソリューションでは、サードパーティの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())