加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何从SparkSQL DataFrame中的MapType列获取键和值

发布时间:2020-12-16 19:18:09 所属栏目:安全 来源:网络整理
导读:我在镶木地板文件中有数据,其中包含2个字段:object_id:String和alpha:Mapgt ;. 它被读入sparkSQL中的数据框,模式如下所示: scala alphaDF.printSchema()root |-- object_id: string (nullable = true) |-- ALPHA: map (nullable = true) | |-- key: stri
我在镶木地板文件中有数据,其中包含2个字段:object_id:String和alpha:Map<&gt ;. 它被读入sparkSQL中的数据框,模式如下所示:

scala> alphaDF.printSchema()
root
 |-- object_id: string (nullable = true)
 |-- ALPHA: map (nullable = true)
 |    |-- key: string
 |    |-- value: struct (valueContainsNull = true)

我正在使用Spark 2.0,我正在尝试创建一个新的数据框,其中列需要是object_id加上ALPHA映射的键,如object_id,key1,key2,…

我是第一次尝试看看我是否至少可以像这样访问地图:

scala> alphaDF.map(a => a(0)).collect()
<console>:32: error: Unable to find encoder for type stored in a Dataset.
Primitive types (Int,String,etc) and Product types (case classes) are 
supported by importing spark.implicits._  Support for serializing other
types will be added in future releases.
   alphaDF.map(a => a(0)).collect()

但不幸的是,我似乎无法弄清楚如何访问地图的键.

有人可以告诉我一种方法来获取object_id加上地图键作为列名和地图值作为新数据帧中的相应值吗?

解决方法

Spark> = 2.3

您可以使用map_keys函数简化该过程:

import org.apache.spark.sql.functions.map_keys

还有map_values函数,但在这里它不会直接有用.

火花< 2.3 一般方法可以用几个步骤表示.首先需要进口:

import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.Row

示例数据:

val ds = Seq(
  (1,Map("foo" -> (1,"a"),"bar" -> (2,"b"))),(2,Map("foo" -> (3,"c"))),(3,Map("bar" -> (4,"d")))
).toDF("id","alpha")

要提取密钥,我们可以使用UDF(Spark< 2.3)

val map_keys = udf[Seq[String],Map[String,Row]](_.keys.toSeq)

或内置函数

import org.apache.spark.sql.functions.map_keys

val keysDF = df.select(map_keys($"alpha"))

找到不同的:

val distinctKeys = keysDF.as[Seq[String]].flatMap(identity).distinct
  .collect.sorted

您还可以使用explode来概括键提取:

import org.apache.spark.sql.functions.explode

val distinctKeys = df
  // Flatten the column into key,value columns
 .select(explode($"alpha"))
 .select($"key")
 .as[String].distinct
 .collect.sorted

并选择:

ds.select($"id" +: distinctKeys.map(x => $"alpha".getItem(x).alias(x)): _*)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读