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

Posted

技术标签:

【中文标题】使用 Spark Dataframe scala 将多个不同的列转换为 Map 列【英文标题】:Converting multiple different columns to Map column with Spark Dataframe scala 【发布时间】:2015-10-18 14:56:27 【问题描述】:

我有一个带有列的数据框:user, address1, address2, address3, phone1, phone2 等等。 我想将此数据框转换为 - user, address, phone where address = Map("address1" -> address1.value, "address2" -> address2.value, "address3" -> address3.value)

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

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

但我不确定如何将其添加到我的 df 中。

我是 spark 和 scala 的新手,在这里真的可以使用一些帮助。

【问题讨论】:

【参考方案1】:

火花 >= 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")
)

火花

据我所知,没有直接的方法可以做到这一点。您可以像这样使用 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 的选项是 struct field 而不是 map:

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

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

【讨论】:

以上是关于使用 Spark Dataframe scala 将多个不同的列转换为 Map 列的主要内容,如果未能解决你的问题,请参考以下文章

使用Scala在Spark中创建DataFrame时出错

使用scala在Spark中转置DataFrame而不进行聚合

在 Spark 上使用 Scala 在 Dataframe 中拆分字符串

spark dataframe 和 scala Map互相转换

使用 Scala 将列分配给 Spark Dataframe 中的另一列

在 Scala 中使用来自另一个没有数组列的 DataFrame 的数组类型列创建 Spark DataFrame 的有效方法是啥?