В PySpark, как разобрать встроенный JSON - PullRequest
0 голосов
/ 13 марта 2019

Я новичок в PySpark.

У меня есть файл JSON со схемой ниже

df = spark.read.json(input_file)

df.printSchema()

 |-- UrlsInfo: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- displayUrl: string (nullable = true)
 |    |    |-- type: string (nullable = true)
 |    |    |-- url: string (nullable = true)
 |-- type: long (nullable = true)

Мне нужен новый фрейм данных результата, который должен содержать только два столбца , тип и UrlsInfo.element.DisplayUrl

Это мой пробный код, который не дает ожидаемого вывода

  df.createOrReplaceTempView("the_table")  
  resultDF = spark.sql("SELECT type, UrlsInfo.element.DisplayUrl FROM the_table")
  resultDF.show()

Я хочу, чтобы resultDF был примерно таким:

Type | DisplayUrl
----- ------------
2    | http://example.com 

Это связано Анализ файла JSON в Pyspark , но не отвечает на мой вопрос.

1 Ответ

2 голосов
/ 13 марта 2019

Как вы можете видеть в своей схеме, 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...|
+----+--------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...