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