Scala 使用另一列中的键查找MapType列中的值
我有一个带两列的Spark流数据帧。一个整数id列和一个MapType列,其中整数id作为键,JSON对象作为值Scala 使用另一列中的键查找MapType列中的值,scala,apache-spark,dictionary,apache-spark-sql,spark-structured-streaming,Scala,Apache Spark,Dictionary,Apache Spark Sql,Spark Structured Streaming,我有一个带两列的Spark流数据帧。一个整数id列和一个MapType列,其中整数id作为键,JSON对象作为值 --------------------------------------------------------------------------------------------------------------- id objects ----------------------------------------------------------
---------------------------------------------------------------------------------------------------------------
id objects
---------------------------------------------------------------------------------------------------------------
1 | (1 -> {"id" : 1, "type": "jpeg"}, 2 -> {"id" : 2, "type": "gif"}, 3 -> {"id" : 3, "type": "png"})
5 | (1 -> {"id" : 1, "type": "jpeg"}, 2 -> {"id" : 2, "type": "gif"}, 3 -> {"id" : 3, "type": "png"})
2 | (1 -> {"id" : 1, "type": "jpeg"}, 2 -> {"id" : 2, "type": "gif"}, 3 -> {"id" : 3, "type": "png"})
---------------------------------------------------------------------------------------------------------------
我想构造一个新的dataframe,它有一个包含JSON对象的列,JSON对象的键与id列匹配
----------------------------------------------------------------------
objects
----------------------------------------------------------------------
{"id" : 1, "type": "jpeg"}
{"id" : 2, "type": "gif" }
----------------------------------------------------------------------
最好的方法是什么?我实现了一个Scala udf,它执行查找并返回相应的对象值,但是我想知道是否可以使用内置的Spark函数来完成同样的操作
我试着这样做:
df.withColumn("obj", $"objects".getItem($"id"))
但它抛出了一个例外:
java.lang.RuntimeException: Unsupported literal type class org.apache.spark.sql.ColumnName
这很有意义,因为
$“id”
是一种列类型。然而,如果我收集,将导致一个行动,我希望避免 不需要自定义项,您可以使用内置功能来执行此操作。但是,不能使用getItem
,因为参数是另一列,而不是字符串值
相反,您可以按如下方式从映射中获取值:
df.withColumn("value", $"objects"($"id"))
要创建新数据框并删除映射中不存在id的行
df.select($"objects"($"id").as("objects")).na.drop
这会给你
+-------------------------+
|objects |
+-------------------------+
|{"id": 1, "type": "jpeg"}|
|{"id": 3, "type": "png"} |
+-------------------------+
在pyspark中这将是什么?@LouisYang:如果您想使用字符串从映射中获取元素,只需使用
getItem
:。如果您想使用列,您可以尝试上述解决方案,但只需删除所有$
(我还没有实际测试过)。