Apache spark Pypark分解嵌套列表

Apache spark Pypark分解嵌套列表,apache-spark,pyspark,Apache Spark,Pyspark,我有以下数据框,我想分解“值”列,以便每个值都位于单独的列中: id | values ----------------------- 1 | '[[532,969020406,89],[216,969100125,23],[169,39356140000,72],[399,14407358500,188],[377,13761937166.6667,24]]' 2 | '[[532,969020406,89]]' 请注意,“值”列下的列表可以有不同的长度,并且它们是字符串数据类型 所需的表

我有以下数据框,我想分解“值”列,以便每个值都位于单独的列中:

id | values
-----------------------
1  | '[[532,969020406,89],[216,969100125,23],[169,39356140000,72],[399,14407358500,188],[377,13761937166.6667,24]]'
2 | '[[532,969020406,89]]'
请注意,“值”列下的列表可以有不同的长度,并且它们是字符串数据类型

所需的表格应如下所示:

id | v11 | v12 | v13 | v21 | v22... 
--------------------------------------
1  | 532 | 969020406 | 89 | 216 | 969100125...
2 | 532 | 969020406 | 89 | Null | Null...
我试图指定模式并使用from_json方法创建数组,然后分解它,但遇到了问题,即任何模式似乎都不适合我的数据

json_schema =  types.StructType([types.StructField('array', types.StructType([ \
    types.StructField("v1",types.StringType(),True), \
    types.StructField("v2",types.StringType(),True), \
    types.StructField("v3",types.StringType(),True)
  ]))])

json_schema = types.ArrayType(types.StructType([ \
    types.StructField("v1",types.StringType(),True), \
    types.StructField("v2",types.StringType(),True), \
    types.StructField("v3",types.StringType(),True)
  ]))

json_schema = types.ArrayType(types.ArrayType(types.IntegerType()))

df.select('id', F.from_json('values', schema=json_schema)).show()
该过程仅返回空值或空数组:[,,]

我还收到以下错误:StructType无法接受类型中的对象“[”

Pyspark推断的输入数据的架构:

root
 |-- id: integer (nullable = true)
 |-- values: string (nullable = true)

非常感谢您的帮助。

对于Spark 2.4+,您可以使用和的组合将字符串转换为二维数组。然后可以将此数组的单个条目分别转换为列

从pyspark.sql导入函数为F
df2=df.withColumn(“解析的\u值”,F.expr(“转换(拆分(值,\\\\],\\\\[”),”+
“c->transform(拆分(c,,”),d->regexp\u替换(d,”[\\\\[\\\\]]',“)”)\
.withColumn(“长度”,F.size(“解析的_值”))
max_length=df2.agg(F.max(“长度”)).head()[“max(长度)”]
df2
现在具有该结构

根目录
|--id:string(nullable=true)
|--值:字符串(null=true)
|--解析的_值:数组(nullable=true)
||--元素:数组(containsnall=true)
|| |--元素:字符串(containsnall=true)
|--长度:整数(nullable=false)
max_length
包含一行中的最大条目数(示例数据为5)

parsed_值[0][1]
将返回第一个条目的第二个子条目。对于示例数据,这将是
969020406

第二步是将嵌套数组转换为列

cols=[F.col('parsed_values').getItem(x).getItem(y).alias(“v{}{}{}.format(x+1,y+1))\
对于范围内的x(0,最大长度),对于范围内的y(0,3)]
df2.select([F.col('id')]+cols.show()
输出:

+---+---+---------+---+----+---------+----+----+-----------+----+----+-----------+----+----+----------------+----+
|id | v11 | v12 | v13 | v21 | v22 | v23 | v31 | v32 | v33 | v41 | v42 | v43 | v51 | v52 | v53|
+---+---+---------+---+----+---------+----+----+-----------+----+----+-----------+----+----+----------------+----+
|  1|532|969020406| 89| 216|969100125|  23| 169|39356140000|  72| 399|14407358500| 188| 377|13761937166.6667|  24|
|2 | 532 | 969020406 | 89 |零|零|零|零|零|零|零|零|零|零|
+---+---+---------+---+----+---------+----+----+-----------+----+----+-----------+----+----+----------------+----+

如果有一种方法可以确定
max_length
,而不必找到完整数据的最大值,例如,如果事先知道该值,则可以改进该解决方案。

您可以为原始数据添加输入数据的模式,例如
df.printSchema()
的输出吗?