问题描述
在将数组拆分为pyspark中的各个列时遇到问题。数组长度是可变的(范围从0到2064)。我试图重用我发现的一段代码,但是由于数据巨大,因此无法正常工作。 这是我在将数组转换为字符串(dec_spec_str)之后尝试的部分。它需要永远。任何帮助表示赞赏。在此先感谢
df2 =df2.select(
"hashval",f.split("dec_spec_str",",").alias("dec_spec_str"),f.posexplode(f.split("dec_spec_str",")).alias("pos","val")
)\
.drop("val")\
.select(
"hashval",f.concat(f.lit("decoded_spec_"),f.col("pos").cast("string")).alias("name"),f.expr("dec_spec_str[pos]").alias("val")
)\
.groupBy("hashval").pivot("name").agg(f.first("val"))
我还想到了创建4000个左右字段的数据框,然后解析并写入其副本的想法。如果那更好,请让我知道该怎么做。我仍然与pyspark达成协议
像这样的inputdecode_spec_str = [1.203.3.455,2.334,1.203,0.345] 这样的输出
解决方法
IIUC,这可能是您的可行解决方案-
在此处创建DF
df = spark.createDataFrame([(1,[1.203,3.455,2.334,1.2034,0.345])],[ "col1","col2"])
#df.show(truncate=False)
df_grp = df.withColumn("explode_col",F.explode_outer("col2"))
df_grp = df_grp.groupBy("col1").pivot("explode_col").agg(F.avg("explode_col"))
df_grp.show()
输入和处理后的输出
+----+------------------------------------+
|col1|col2 |
+----+------------------------------------+
|1 |[1.203,0.345]|
+----+------------------------------------+
+----+-----+-----+------+-----+-----+
|col1|0.345|1.203|1.2034|2.334|3.455|
+----+-----+-----+------+-----+-----+
| 1|0.345|1.203|1.2034|2.334|3.455|
+----+-----+-----+------+-----+-----+
现在,您将观察到列名不是预期的东西,#在此处重新排序列名的小技巧
count = 1
for col in df_grp.columns:
if col != "col1":
df_grp = df_grp.withColumnRenamed(col,"ftr"+str(count))
print(col)
print(count)
count = count+1
最终输出
+----+-----+-----+------+-----+-----+
|col1| ftr1| ftr2| ftr3| ftr4| ftr5|
+----+-----+-----+------+-----+-----+
| 1|0.345|1.203|1.2034|2.334|3.455|
+----+-----+-----+------+-----+-----+