Как вы можете видеть в своей схеме, UrlsInfo
является типом массива, а не структурой.Таким образом, элемент схемы «элемент» ссылается не на именованное свойство (вы пытаетесь получить к нему доступ с помощью .element
), а на элемент массива (который отвечает на индекс типа [0]
).
IВы воспроизвели вашу схему вручную:
from pyspark.sql import Row
df = spark.createDataFrame([Row(UrlsInfo=[Row(displayUri="http://example.com", type="narf", url="poit")], Type=2)])
df.printSchema()
root
|-- Type: long (nullable = true)
|-- UrlsInfo: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- displayUri: string (nullable = true)
| | |-- type: string (nullable = true)
| | |-- url: string (nullable = true)
, и я могу создать таблицу, аналогичную той, которую вы, похоже, ищете, используя индекс:
df.createOrReplaceTempView("temp")
resultDF = spark.sql("SELECT type, UrlsInfo[0].DisplayUri FROM temp")
resultDF.show()
+----+----------------------+
|type|UrlsInfo[0].DisplayUri|
+----+----------------------+
| 2| http://example.com|
+----+----------------------+
Однако,это дает только первый элемент (если есть) UrlsInfo
во втором столбце.
РЕДАКТИРОВАТЬ: Я забыл о функция EXPLODE
,который вы можете использовать здесь для обработки UrlsInfo
элементов как набора строк:
from pyspark.sql import Row
df = spark.createDataFrame([Row(UrlsInfo=[Row(displayUri="http://example.com", type="narf", url="poit"), Row(displayUri="http://another-example.com", type="narf", url="poit")], Type=2)])
df.createOrReplaceTempView("temp")
resultDF = spark.sql("SELECT type, EXPLODE(UrlsInfo.displayUri) AS displayUri FROM temp")
resultDF.show()
+----+--------------------+
|type| displayUri|
+----+--------------------+
| 2| http://example.com|
| 2|http://another-ex...|
+----+--------------------+