Создать новый Dataframe из dataframe с Column, содержащим данные JSON - PullRequest
0 голосов
/ 02 мая 2019

это первый раз, когда я спрашиваю об этом. У меня есть датафрейм, как это

+----------+----------------------------------+
|        id|                              data|
+----------+----------------------------------+
|     '001'|     '[{"index":1}, {"index": 2}]'|
|     '002'|     '[{"index":3}, {"index": 4}]'|
+----------+----------------------------------+

Мне нужно преобразовать его в новый DF вот так

+----------+---------+
|        id|    index|
+----------+---------+
|     '001'|        1|
|     '001'|        2|
|     '002'|        3|
|     '002'|        4|
+----------+---------+

Есть ли способ сделать это? Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Это еще один подход, который я разработал.Он включает в себя различные операторы, однако все эти операторы могут быть объединены в один для получения желаемого результата.

После создания исходного кадра данных с именем 'df',

df.show(5,False)
+---+----------------------------+
|id |data                        |
+---+----------------------------+
|001|[{"index": 1}, {"index": 2}]|
|002|[{"index": 3}, {"index": 4}]|
+---+----------------------------+

df2= df.select (col ('id'), split (df.data, ','). alias ('list'))

Это создает фрейм данных с именем 'df2', который разбит на второй столбецв тип массива.

df2.show(5,False)
+---+-------------------------------+
|id |list                           |
+---+-------------------------------+
|001|[[{"index": 1},  {"index": 2}]]|
|002|[[{"index": 3},  {"index": 4}]]|
+---+-------------------------------+

затем, запустив функцию разнесения, df3 = df2.select (col ('id'), explode (df2.list))

df3.show(5,False)
+---+--------------+
|id |col           |
+---+--------------+
|001|[{"index": 1} |
|001| {"index": 2}]|
|002|[{"index": 3} |
|002| {"index": 4}]|
+---+--------------+

, а затемby, df4 = df3.select (col ('id'), regexp_extract ('col', '(\ d +)', 1) .alias ('no_only')) это преобразование проверяет число в разбитом столбце.

df4.show(5,False)
+---+-------+
|id |no_only|
+---+-------+
|001|1      |
|001|2      |
|002|3      |
|002|4      |
+---+-------+
0 голосов
/ 02 мая 2019

Попробуйте это ~

 df = self.spark.createDataFrame(
            [('001', '[{"index": 1}, {"index": 2}]'),
             ('002', '[{"index": 3}, {"index": 4}]'),
             ],
            ("id", "data"))

        schema = ArrayType(StructType([StructField("index", IntegerType())]))
        df = df.withColumn("json", from_json("data", schema))

        df.show(100)
        df = df.select(col("id"), explode("json").alias("index"))
        df.show(100)


+---+--------------------+----------+
| id|                data|      json|
+---+--------------------+----------+
|001|[{"index": 1}, {"...|[[1], [2]]|
|002|[{"index": 3}, {"...|[[3], [4]]|
+---+--------------------+----------+

+---+-----+
| id|index|
+---+-----+
|001|  [1]|
|001|  [2]|
|002|  [3]|
|002|  [4]|
+---+-----+

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