Pyspark 从Spark BinaryType中提取字节

Pyspark 从Spark BinaryType中提取字节,pyspark,spark-dataframe,pyspark-sql,Pyspark,Spark Dataframe,Pyspark Sql,我有一个具有BinaryType类型的二进制列的表: >>> df.show(3) +--------+--------------------+ | t| bytes| +--------+--------------------+ |0.145533|[10 50 04 89 00 3...| |0.345572|[60 94 05 89 80 9...| |0.545574|[99 50 68 89 00 7...| +------

我有一个具有BinaryType类型的二进制列的表:

>>> df.show(3)
+--------+--------------------+
|       t|               bytes|
+--------+--------------------+
|0.145533|[10 50 04 89 00 3...|
|0.345572|[60 94 05 89 80 9...|
|0.545574|[99 50 68 89 00 7...|
+--------+--------------------+
only showing top 3 rows
>>> df.schema
StructType(List(StructField(t,DoubleType,true),StructField(bytes,BinaryType,true)))
如果我提取二进制文件的第一个字节,我会从Spark得到一个异常:

>>> df.select(n["t"], df["bytes"].getItem(0)).show(3)
AnalysisException: u"Can't extract value from bytes#477;"
ArrayType(ByteType)
的强制转换也不起作用:

>>> df.select(n["t"], df["bytes"].cast(ArrayType(ByteType())).getItem(0)).show(3)
AnalysisException: u"cannot resolve '`bytes`' due to data type mismatch: cannot cast BinaryType to ArrayType(ByteType,true) ..."

如何提取字节?

您可以为此制作一个简单的自定义项:

从pyspark.sql导入函数为f
a=字节数组([10,50,04])
df=sqlContext.createDataFrame([(1,a),(2,a)],(“t”,“bytes”))
df.show()
编辑

如果希望提取位置成为参数,可以执行以下操作:

func=lambda i:lambda a:a[i]
my_udf=lambda i:f.udf(func(i))
df.select(my_udf(2)(df['bytes')).alias(“last”)).show()
+----+
|最后|
+----+
|   4|
|   4|
+----+

您可以为此制作一个简单的自定义项:

从pyspark.sql导入函数为f
a=字节数组([10,50,04])
df=sqlContext.createDataFrame([(1,a),(2,a)],(“t”,“bytes”))
df.show()
编辑

如果希望提取位置成为参数,可以执行以下操作:

func=lambda i:lambda a:a[i]
my_udf=lambda i:f.udf(func(i))
df.select(my_udf(2)(df['bytes')).alias(“last”)).show()
+----+
|最后|
+----+
|   4|
|   4|
+----+
+---+----------+
|  t|     bytes|
+---+----------+
|  1|[0A 32 04]|
|  2|[0A 32 04]|
+---+----------+
u = f.udf(lambda a: a[0])
df.select(u(df['bytes']).alias("first")).show()
+-----+
|first|
+-----+
|   10|
|   10|
+-----+