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

时间:2015-09-07 15:13:59

标签: python apache-spark avro spark-dataframe

我面临以下困难: 我使用的是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

它在转换中失败了!

1 个答案:

答案 0 :(得分:4)

我使用的是一个糟糕的spark-avro版本。建立最新版本后,一切正常。