我有一个拼花文件中的数据,它有两个字段:<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
加上ALPHA
map中的键,如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加上映射键作为列名,并将映射值作为新数据帧中的相应值吗?
如果你在PySpark,我只是找到一个简单的实现:
from pyspark.sql.functions import map_keys
alphaDF.select(map_keys("ALPHA").alias("keys")).show()
你可以在这里查看详细信息
火花
您可以使用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/
问题内容: 我可以想到两种方式: 惯用的方式是什么?也许已经有一个库函数可以完全满足我的需求? 问题答案: 我猜这种方式(或至少是另一种方式)更有效: 由于该函数与完全兼容,因为它需要并返回。不执行自动装箱。 我也在寻找一个等价的,我希望写一个等价的您的方法: 但是他们没有提供这种方法。不知道为什么。