gpt4 book ai didi

scala - 使用 Spark Dataframe scala 将多个不同列转换为 Map 列

转载 作者:行者123 更新时间:2023-12-02 20:27:18 25 4
gpt4 key购买 nike

我有一个数据框,其中包含以下列:user、address1、address2、address3、phone1、phone2 等。我想将此数据帧转换为 - 用户、地址、电话,其中地址 = Map("address1"-> address1.value, "address2"-> address2.value, "address3"-> address3.value)

我能够使用以下方法将列转换为 map :

val mapData = List("address1", "address2", "address3")
df.map(_.getValuesMap[Any](mapData))

但我不知道如何将其添加到我的 df 中。

我是 Spark 和 scala 的新手,在这里确实需要一些帮助。

最佳答案

Spark >= 2.0

您可以跳过udf并使用map(Python中的create_map)SQL函数:

import org.apache.spark.sql.functions.map

df.select(
map(mapData.map(c => lit(c) :: col(c) :: Nil).flatten: _*).alias("a_map")
)

Spark <2.0

据我所知,没有直接的方法可以做到这一点。您可以像这样使用 UDF:

import org.apache.spark.sql.functions.{udf, array, lit, col}

val df = sc.parallelize(Seq(
(1L, "addr1", "addr2", "addr3")
)).toDF("user", "address1", "address2", "address3")

val asMap = udf((keys: Seq[String], values: Seq[String]) =>
keys.zip(values).filter{
case (k, null) => false
case _ => true
}.toMap)

val keys = array(mapData.map(lit): _*)
val values = array(mapData.map(col): _*)

val dfWithMap = df.withColumn("address", asMap(keys, values))

另一个不需要 UDF 的选项是使用结构字段而不是映射:

val dfWithStruct = df.withColumn("address", struct(mapData.map(col): _*))

最大的优点是可以轻松处理不同类型的值。

关于scala - 使用 Spark Dataframe scala 将多个不同列转换为 Map 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33199406/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com