Я застрял, пытаясь извлечь столбцы из списка списков, но не могу представить, как это сделать. Я новичок в искрах. Запуск pyspark на Spark 2.4.3.
У меня есть json, организованный следующим образом:
{ "meta" : { ... },
"data" :
[[ "a", 0, null, "{ }"],
[ "b", 0, null, "{ }"],
[ "c", 0, null, "{ }"],
] }
Я хочу получить часть «данных» в столбцы, например
+------+------+------+------+
| col1 | col2 | col3 | col4 |
+------+------+------+------+
| a | 0 | None | "{ }"|
| b | 0 | None | "{ }"|
| c | 0 | None | "{ }"|
У меня есть фрейм данных, и printSchema() показывает это.
root
|-- data: array (nullable = true)
| |-- element: array (containsNull = true)
| | |-- element: string (containsNull = true)
|-- meta: struct (nullable = true)
| |-- view: struct (nullable = true)
| | |-- approvals: array (nullable = true) ...
Моя грубая форма - 70 столбцов на 650 тыс. строк.
Я смог взорвать df, чтобы получить только часть data
, но застрял там.
Сначала взорвите строки, а затем выберите элементы массива, используя []
в Python.
df2 = df.select(F.explode('data').alias('data')) \
.select(*[F.col('data')[i].alias('col%s'%(i+1)) for i in range(4)])
df2.show()
+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
| a| 0|null| { }|
| b| 0|null| { }|
| c| 0|null| { }|
+----+----+----+----+
Почему бы вам не использовать только метод SparkSession.createDataFrame()?
Вы можете предоставить данные и параметры схемы этому методу и получить искровой фрейм данных.
Пример:
from pyspark.sql import SparkSession
sparkSession = SparkSession.builder.getOrCreate()
df = sparkSession.createDataFrame(data)
Если искра не может вывести схему из данных, тогда также необходимо предоставить схему
from pyspark.sql.types import StructType
struct = StructType()
struct.add("col1", "string", True)
struct.add("col2", "integer", True)
struct.add("col3", "string", True)
struct.add("col4", "string", True)
df = sparkSession.createDataFrame(data=data, schema=struct)
Кроме того, вы можете использовать классы типов pyspark вместо имен примитивных типов python. https://spark.apache.org/docs/2.4.3/api/python/pyspark.sql.html#module-pyspark.sql.types
модуль содержит как простые типы (StringType, IntegerType,...), так и сложные типы (ArrayType, MapType,...)
Последнее замечание: данные не могут содержать null
, они должны быть None
в питоне. spark DataFrame.show() будет печатать None
столбцов как null
.
Я не хотел указывать схему, так как у меня 70 столбцов.
Вы можете получить доступ к отдельным элементам массива через функцию
getItem
, как показано здесь. stackoverflow.com/questions/47874037/…