将数组拆分为列pyspark-array长度变量

问题描述

在将数组拆分为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] 这样的输出

enter image description here

解决方法

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|
+----+-----+-----+------+-----+-----+

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...