我有以下数据。
data = [
[
"2022-12-12",
["IND", "u1", [["auction_1", [[1,20], [2,12]]], ["auction_2", [[1,5], [2,7]]]]],
],
[
"2022-12-12",
["USA", "u2", [["auction_1", [[1,8], [2,12]]], ["auction_2", [[1,11], [2,4]]]]],
],
]
我有以下模式
x一个一个一个一个x一个一个二个一个x一个一个三个一个
我想有数据在下面的格式作进一步分析.
date, country, userId, refferalId, action, amountSpent, timeSpent
2022-12-31, IND, 123, 123213, action1, 5, 56
display(df.select(F.explode("data")))
# cannot resolve 'explode(data)' due to data type mismatch: input to function explode should be an array or map type
任何帮助都将不胜感激。
如果不能分解任何StructType
,如何实现上述数据格式?
我也看了这些问题,但没有得到太多帮助-〉Error while exploding a struct column in Spark
3条答案
按热度按时间wwtsj6pe1#
您必须分解数据。用户:
对于这些操作,您需要如下所示的查询(在分解data.users之后):
但是因为你把动作定义为结构体,所以它不能被分解,如果你把它的模式改为列表,代码就能正常工作
2ic8powd2#
这基本上是一项需要转换大量数据以使其成为所需形式的任务,需要结合使用
pyspark.sql.functions
才能得到所需的形式。如果我们从您的
df
开始:每个转换的操作:
select
语句解包data
结构并分解data.users
数组select
语句解包users
结构withColumn
语句稍微复杂一些,此时我们有两个结构体(action1
和action2
),它们有相同的模式,我们在这里做的是:actions
列添加一个文本列action
,值为action1
或action2
array
函数将这两个相似的列放入数组中actions
结构体希望这有帮助!
c2e8gylq3#
问题是你不能分解struct,你只能分解数组或map,你需要做的第一步是分解
data.users
(不仅仅是数据),你可以这样做:从那里,你想要分解动作,但是和以前一样,你不能分解结构体。为了克服这个问题,你可以把它转换成一个结构体数组。