当前位置: 首页 > 知识库问答 >
问题:

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

冷越泽
2023-03-14

我有一个拼花文件中的数据,它有两个字段:<code>object_id:String</code>和<code>alpha:Map

它被读入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加上ALPHAmap中的键,如object_id、key1、key2、key3、

我首先想看看我是否至少可以像这样访问地图:

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()

但不幸的是,我似乎无法找到如何访问地图的键。

有人能告诉我如何将< code>object_id加上映射键作为列名,并将映射值作为新数据帧中的相应值吗?

共有2个答案

越新霁
2023-03-14

如果你在PySpark,我只是找到一个简单的实现:

from pyspark.sql.functions import map_keys

alphaDF.select(map_keys("ALPHA").alias("keys")).show()

你可以在这里查看详细信息

栾弘新
2023-03-14

火花

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

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

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

火花

一般方法可以用几个步骤来表示。首次需要导入:

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(火花

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

您还可以使用爆炸来泛化提取:

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)): _*)
 类似资料:
  • 问题内容: 我正在用Java写一个简单的编辑文本。当用户打开文件时,将在中打开文件。我执行以下操作来保存打开的文件: 将从何处接收值,例如:。 我有一堂课: 现在,在此类中,我需要获取存储在中的值。我怎样才能做到这一点? 问题答案: 要从地图获取所有值: 要从地图中获取所有条目,请执行以下操作: Java 8更新: 处理所有值: 要处理所有条目:

  • 我有下表: 赛季表示足球赛季,name1,name2表示球员在给定比赛中的位置Goal1表示Name1进球数 我想为每个赛季的每个名字生成一个列表,列出他们踢了多少次球,以及他们进球的数量。类似这样: 任何帮助都将不胜感激!

  • 问题内容: 我有一本Swift字典。我想获得钥匙的价值。密钥方法的对象对我不起作用。如何获得字典键的值? 这是我的字典: 问题答案: 使用下标访问字典键的值。这将返回一个可选: 要么 您还可以枚举所有键和值: 或枚举所有值:

  • 问题内容: 我在我的socket.io聊天应用程序的Redis存储中存储了用户名/ SocketID对。 当用户断开连接时,我需要从Redis存储中删除用户名/ socketID对。我已经看到了如何从键中获取值,但从未从值中获取键。可能吗?或无论哪种方式,我怎么能只从值中删除键/值对。这是我的代码 用于在连接上添加存储 对于断开连接,客户端将不知道何时断开连接,可能是由于Internet连接断开而

  • 问题内容: 我正在返回一个json,如下所示 我正在尝试获取每个元素的键和值: 我正在戒备。为什么?我尝试过,我尝试循环但没有成功。 问题答案: 检查这个jsfiddle 从 jQuery 3.0开始 ,不推荐使用$ .parseJSON。要解析JSON字符串,请改用本机JSON.parse方法。 来源:http://api.jquery.com/jquery.parsejson/

  • 问题内容: 我可以想到两种方式: 惯用的方式是什么?也许已经有一个库函数可以完全满足我的需求? 问题答案: 我猜这种方式(或至少是另一种方式)更有效: 由于该函数与完全兼容,因为它需要并返回。不执行自动装箱。 我也在寻找一个等价的,我希望写一个等价的您的方法: 但是他们没有提供这种方法。不知道为什么。