Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 使用另一列中的键查找MapType列中的值_Scala_Apache Spark_Dictionary_Apache Spark Sql_Spark Structured Streaming - Fatal编程技术网

Scala 使用另一列中的键查找MapType列中的值

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

我有一个带两列的Spark流数据帧。一个整数id列和一个MapType列,其中整数id作为键,JSON对象作为值

---------------------------------------------------------------------------------------------------------------
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
:。如果您想使用列,您可以尝试上述解决方案,但只需删除所有
$
(我还没有实际测试过)。