Pyspark 使用readStream对象(Spark Structured Streaming)将数据帧列的内容从二进制类型转换为numpy数组

Pyspark 使用readStream对象(Spark Structured Streaming)将数据帧列的内容从二进制类型转换为numpy数组,pyspark,pattern-matching,user-defined-functions,spark-structured-streaming,numpy-ndarray,Pyspark,Pattern Matching,User Defined Functions,Spark Structured Streaming,Numpy Ndarray,我的目标是使用readStream.format(“image”).schema(imageSchema)对象、格式和模式导入图像,其中imageSchema是: imageSchema = StructType([StructField("image", StructType([ StructField("origin", StringType()), StructField("height", IntegerType()), StructField("width", Intege

我的目标是使用
readStream.format(“image”).schema(imageSchema)
对象、格式和模式导入图像,其中imageSchema是:

imageSchema = StructType([StructField("image", StructType([
  StructField("origin", StringType()),
  StructField("height", IntegerType()),
  StructField("width", IntegerType()),
  StructField("nChannels", IntegerType()),
  StructField("mode", IntegerType()),
  StructField("data", BinaryType())
  ]))
])

我的目标是将最后一列数据(其形状为606300,1)转换为形状为430470,3的numpy数组。在使用readStream方法之前,我使用
read
进行了测试,只有1个image->我成功地使用了以下方法:

testIMage = spark.read.format("image").schema(imageSchema).load("/path/img").select("image.data").take(1)[0][0]

array = np.reshape(testImage, (430,470,3))
回顾我以前的代码,我想知道:

  • 是否可以使用等价的
    .take(1)[0][0]
    来获得来自我的readStream的每个新图像的全部值
  • 我知道Spark Structured Streaming与DataFrame对象一起工作,因此我必须在转换后将我的numpy数组转换为DataFrame。为此,我尝试创建一个UDF函数,但我不明白它有什么问题(请参阅下一段代码)
>>从pyspark.sql.functions导入*
>>>def到_np_阵列(x):
...    返回np.重塑(x,(430470,3)).tolist()
... 
>>>spark_to_np_array=udf(to_np_array,ArrayType(IntegerType()))
>>>zz=图像方向,带列('nparray',火花到阵列('data'))
>>>zz
DataFrame[数据:二进制,N数组:数组]
>>>zz.writeStream.format(“控制台”).start()
-------------------------------------------                                                                                                                                                                                                    
批次:0
-------------------------------------------
+--------------------+--------------------+
|数据| n阵列|
+--------------------+--------------------+
|[50514F4F504…。]|
|[50514F4F504…。]|
|[50 52 4C 50 52 4…||
|[50 52 4C 50 52 4…||
|[50 52 4C 50 52 4…||
........
+--------------------+--------------------+
仅显示前20行
有人成功地实现了这种转变吗

上下文是,我想比较来自我的流的图像的RGB值,比如在坐标(128377)处,以了解它们是否包含在定义的树中。我想知道这个像素是否是灰色的(灰色约为R:200,G:200,B:200)。在重塑它之后,使用numpy数组,我只需查询
数组[377][127]
了解其RGB值

>>> from pyspark.sql.functions import *
>>> def to_np_array(x):    
...    return np.reshape(x, (430,470,3)).tolist()
... 
>>> spark_to_np_array = udf(to_np_array, ArrayType(IntegerType()))
>>> zz = image_df.withColumn('nparray', spark_to_np_array('data'))
>>> zz
DataFrame[data: binary, nparray: array<int>]
>>> zz.writeStream.format("console").start()
<pyspark.sql.streaming.StreamingQuery object at 0x7ff52e386e50>
-------------------------------------------                                                                                                                                                                                                    
Batch: 0
-------------------------------------------
+--------------------+--------------------+
|                data|             nparray|
+--------------------+--------------------+
|[50 51 4F 4F 50 4...|[,,,,,,,,,,,,,,,,...|
|[50 51 4F 4F 50 4...|[,,,,,,,,,,,,,,,,...|
|[50 52 4C 50 52 4...|[,,,,,,,,,,,,,,,,...|
|[50 52 4C 50 52 4...|[,,,,,,,,,,,,,,,,...|
|[50 52 4C 50 52 4...|[,,,,,,,,,,,,,,,,...|
........
+--------------------+--------------------+
only showing top 20 rows