将数组拆分为列pyspark array length变量

dohp0rv5  于 2021-05-18  发布在  Spark
关注(0)|答案(1)|浏览(600)

我在pyspark中将数组拆分为单独的列时遇到了一个问题。数组长度是可变的(范围为0-2064)。我试着重用我发现的一段代码,但由于数据量巨大,它无法工作。这是我在将数组转换成字符串(dec\u spec\u 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个左右字段的Dataframe,然后解析并写入该字段或其副本。如果这样更好,请告诉我怎么做。我还在和皮斯帕克相处
像这样输入decode\u spec\u str=[1.203.3.455,2.334,1.203,0.345]像这样输出

k0pti3hp

k0pti3hp1#

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, 3.455, 2.334, 1.2034, 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|
+----+-----+-----+------+-----+-----+

相关问题