Pyspark DataFrame - конвертировать столбец с массивом из n элементов «ключ = значение» в n новых столбцов - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть следующий Dataframe

+-------_--------------------------------------------+
| Col1                                               |
+------_---------------------------------------------+
|["field1=abc","field2=asd",....,"fieldN=zzz"]       |
|["field1=abc1","field2=asd1",....,"fieldN=zzz1"]    |  
|["field1=abc2","field2=asd2",....,"fieldN=zzz2"]    |  
| .................................................  |
+----------------------------------------------------+

к этому

+-------_--------------------------------------------+
| field1 | field2 | ....        | fieldN             |
+------_---------------------------------------------+
|abc     | asd    |....         | zzz                |
|abc1    | asd1   |....         | zzz1               |
|abc2    | asd2   |....         | zzz2               |
| .................................................  |
+----------------------------------------------------+

Я нашел несколько примеров, таких как

df=df.withColumn('name', F.col('exploded').getItem(0))

, но так как у меня много полей, я быпредпочитаете что-то более общее

Есть идеи?

1 Ответ

0 голосов
/ 28 сентября 2018

Предполагая, что ваш столбец является структурным типом, а не просто строкой данных JSON:

Есть несколько вариантов.Вы можете использовать «field. *» В SQL, чтобы выбрать все подполя.Самый простой способ сделать это в python - это метод selectExpr в DataFrame.Обратите внимание, что вы также можете выбрать другие поля, если хотите сохранить их.Например:

>>> data = [
    ((1, 2, 3, 4),),
    ((4, 5, 6, 7),)
]

>>> df = spark.createDataFrame(sc.parallelize(data))

>>> df.printSchema()
root
 |-- _1: struct (nullable = true)
 |    |-- _1: long (nullable = true)
 |    |-- _2: long (nullable = true)
 |    |-- _3: long (nullable = true)
 |    |-- _4: long (nullable = true)

>>> df.show()
+------------+
|          _1|
+------------+
|[1, 2, 3, 4]|
|[4, 5, 6, 7]|
+------------+


>>> df2 = df.selectExpr("_1 as original", "_1.*")
>>> df2.show()
+------------+---+---+---+---+
|    original| _1| _2| _3| _4|
+------------+---+---+---+---+
|[1, 2, 3, 4]|  1|  2|  3|  4|
|[4, 5, 6, 7]|  4|  5|  6|  7|
+------------+---+---+---+---+

В качестве альтернативы, поле схемы в DataFrame может использоваться для определения всех полей и их типов, а также любых подполей.Затем вы можете использовать эти имена, чтобы зациклить их и использовать withColumn, как вы делали выше.Например:

>>> struct_field = next(f for f in df.schema if f.name == "_1")
>>> subfield_names = [f.name for f in struct_field.dataType.fields]
>>> print subfield_names
['_1', '_2', '_3', '_4']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...