Преобразуйте содержимое столбца DataFrame из BinaryType в пустой массив с помощью объекта readStream (Spark Structured Streaming) - PullRequest
0 голосов
/ 03 ноября 2019

Моя цель - импортировать изображение, используя объект, формат и схему 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())
  ]))
])

Моя цель - преобразовать последний столбец data (которыйимеет форму 606300,1) в виде массива фигур (430,470,3). Перед использованием метода readStream я протестировал с read и только с 1 изображением -> мне удалось сделать это со следующим:

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, поэтомуЯ должен был бы преобразовать мой массивный массив в DataFrame после преобразования. Для этого я попытался создать функцию UDF, но я не понимаю, что с ней не так (см. Следующий код).
>>> 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

Кому-нибудь удалось сделать такое преобразование?

Контекст заключается в том, что я хочу сравнить значения RGB изображения, поступающего из моего потока, скажем, в координатах (128 377), чтобы узнать, содержатся ли они в определенном пороге: я хочу знать, еслиэтот пиксель серый или нет (серый - прим. R: 200, G: 200, B: 200). Используя массив numpy после изменения его формы, я просто должен запросить array[377][127], чтобы узнать его значения RGB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...