我一直在尝试从列表中提取列,但无法想象如何做到这一点。我对spark来说还是个新手。在Spark 2.4.3上运行pyspark。
我有一个像这样组织的json:
{ "meta" : { ... },
"data" :
[[ "a", 0, null, "{ }"],
[ "b", 0, null, "{ }"],
[ "c", 0, null, "{ }"],
] }
我想把'data‘部分放到列中,比如
+------+------+------+------+
| 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列乘650k行。
我能够爆炸df,只获得data
部分,但被困在那里。
发布于 2020-12-18 14:11:23
首先分解行,然后使用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| { }|
+----+----+----+----+
发布于 2020-12-18 15:56:04
为什么不直接使用SparkSession.createDataFrame()方法呢?
您可以向此方法提供数据和模式参数,并获取spark dataframe。
示例:
from pyspark.sql import SparkSession
sparkSession = SparkSession.builder.getOrCreate()
df = sparkSession.createDataFrame(data)
如果spark无法从数据中推断出模式,则还需要提供模式
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
,在python中应该是None
。spark DataFrame.show()将把None
列打印为null
。
https://stackoverflow.com/questions/65351449
复制相似问题