为什么将 Dataframe 转储到 Avro 文件无法在 Python 中转换 bytearray?

Why does dumping Dataframe to Avro file fail to convert bytearray in Python?

我面临以下困难: 我正在使用 Spark 1.4.1、Python 2.7.8 和 spark-avro_2.10-1.0.0

我正在尝试使用 spark-avro 将 Python 字节数组存储在 avro 文件中。我的目的是存储与使用特定图像编码器编码的图像块相对应的字节链。

它因转换异常而失败:

org.apache.avro.file.DataFileWriter$AppendWriteException: org.apache.avro.UnresolvedUnionException: Not in union ["bytes","null"]:

这是我为重现问题而制作的示例:

from pyspark import SparkContext, SparkConf
from pyspark.sql import SQLContext, Row

import os
import tempfile


# Just setting name of the Spark app
conf = SparkConf().setAppName("pyspark test")
sc = SparkContext(conf=conf)

sqlContext = SQLContext(sc)

# build Data frame containing bytearrays (stupid)
data = map(lambda x: bytearray(str(x)), range(5))

rdd = sc.parallelize(data)

# convert data to SQL Row
rdd_row = rdd.map(lambda b:  Row(val=b))

# create a DataFrame
df = sqlContext.createDataFrame(rdd_row)
df.registerTempTable('test')

# try to dump it
outputFile = os.path.join(tempfile.gettempdir(), 'test.avro')
df.write.format("com.databricks.spark.avro").save(outputFile)

这是使用

启动的
spark-submit --master local[1] --jars "spark-avro_2.10-1.0.0.jar" testBytearray.py

并且转换失败!

我使用的是错误版本的 spark-avro。构建最新版本后,一切正常。