java 将字符串数组触发分解为列

ddrv8njm  于 2022-10-30  发布在  Java
关注(0)|答案(3)|浏览(178)

我在Java中使用Spark,我有一个如下所示的 Dataframe :

id  | array_column
-------------------
12  | [a:123, b:125, c:456]
13  | [a:443, b:225, c:126]

我想用相同的id分解array_column,但是explode不起作用,因为我想让dataframe变成:

id  | a  | b  | c
-------------------
12  |123 |125 | 456 
13  |443 |225 | 126
ikfrs5lh

ikfrs5lh1#

以下方法适用于array_column中的可变长度列表。该方法使用explode扩展array_column中的字符串元素列表,然后使用:将每个字符串元素分别拆分为两个不同的列col_namecol_val。最后,使用带有group by的透视表将数据转置为所需的格式。
下面的示例使用了pysparkapi,但是可以很容易地转换为java/scala api,因为它们是类似的。

from pyspark.sql import functions as F

output_df = (
    input_df.select("id",F.explode("array_column").alias("acol"))
            .select(
                "id",
                F.split("acol",":")[0].alias("col_name"),
                F.split("acol",":")[1].cast("integer").alias("col_val")
            )
            .groupBy("id")
            .pivot("col_name")
            .max("col_val")
)

告诉我这是否适合你。

yhived7q

yhived7q2#

一种非常类似的方法就像gordon在Java中的回答:

import static org.apache.spark.sql.functions.*;

Dataset<Row> df = ...

df.withColumn("array_column", explode(col("array_column")))
        .withColumn("array_column", split(col("array_column"), ":"))
        .withColumn("key", col("array_column").getItem(0))
        .withColumn("value", col("array_column").getItem(1))
        .groupBy(col("id"))
        .pivot(col("key"))
        .agg(first("value")) //1
        .show();

输出量:

+---+---+---+---+
| id|  a|  b|  c|
+---+---+---+---+
| 12|456|225|126|
| 11|123|125|456|
+---+---+---+---+

我假设id和数组中的键字段的组合是唯一的,这就是为什么在//1中使用的聚合函数是first的原因。如果这个组合不是唯一的,聚合函数可以改为collect_list,以获得所有匹配值的数组。

qhhrdooz

qhhrdooz3#

从列内的字符串中提取列名称:

  • 创建一个正确的JSON字符串(在json对象和值周围使用引号)
  • 使用此列创建架构
  • 创建struct并将其分解为列

输入示例:

from pyspark.sql import functions as F
df = spark.createDataFrame(
    [(12, ['a:123', 'b:125', 'c:456']),
     (13, ['a:443', 'b:225', 'c:126'])],
    ['id', 'array_col'])

df.show(truncate=0)

# +---+---------------------+

# |id |array_col            |

# +---+---------------------+

# |12 |[a:123, b:125, c:456]|

# |13 |[a:443, b:225, c:126]|

# +---+---------------------+

脚本:

df = df.withColumn("array_col", F.expr("to_json(str_to_map(array_join(array_col, ',')))"))
json_schema = spark.read.json(df.rdd.map(lambda row: row.array_col)).schema
df = df.withColumn("array_col", F.from_json("array_col", json_schema))
df = df.select("*", "array_col.*").drop("array_col")

df.show()

# +---+---+---+---+

# | id|  a|  b|  c|

# +---+---+---+---+

# | 12|123|125|456|

# | 13|443|225|126|

# +---+---+---+---+

相关问题