如何在火花映射函数中输出多个(键,值)

Posted

技术标签:

【中文标题】如何在火花映射函数中输出多个(键,值)【英文标题】:how to output multiple (key,value) in spark map function 【发布时间】:2016-10-13 11:46:10 【问题描述】:

输入数据的格式如下:

+--------------------+-------------+--------------------+
|           StudentID|       Right |             Wrong  |
+--------------------+-------------+--------------------+
|       studentNo01  |       a,b,c |            x,y,z   |
+--------------------+-------------+--------------------+
|       studentNo02  |         c,d |              v,w   |
+--------------------+-------------+--------------------+

输出的格式如下():

+--------------------+---------+
|           key      |    value|
+--------------------+---------+
|     studentNo01,a  |       1 |
+--------------------+---------+
|     studentNo01,b  |       1 |
+--------------------+---------+
|     studentNo01,c  |       1 | 
+--------------------+---------+
|     studentNo01,x  |       0 | 
+--------------------+---------+
|     studentNo01,y  |       0 | 
+--------------------+---------+
|     studentNo01,z  |       0 | 
+--------------------+---------+
|     studentNo02,c  |       1 | 
+--------------------+---------+
|     studentNo02,d  |       1 | 
+--------------------+---------+
|     studentNo02,v  |       0 | 
+--------------------+---------+
|     studentNo02,w  |       0 | 
+--------------------+---------+

正确的意思是1,错误的意思是0。

我想使用 Spark map 函数或 udf 处理这些数据,但我不知道如何处理。你能帮我吗?谢谢。

【问题讨论】:

你想要一个数据框输入和一个RDD输出吗? 【参考方案1】:

使用拆分和爆炸两次并进行并集

val df = List(
  ("studentNo01","a,b,c","x,y,z"),
  ("studentNo02","c,d","v,w")
  ).toDF("StudenID","Right","Wrong")

+-----------+-----+-----+
|   StudenID|Right|Wrong|
+-----------+-----+-----+
|studentNo01|a,b,c|x,y,z|
|studentNo02|  c,d|  v,w|
+-----------+-----+-----+


val pair = (
  df.select('StudenID,explode(split('Right,",")))
    .select(concat_ws(",",'StudenID,'col).as("key"))
    .withColumn("value",lit(1))
).unionAll(
  df.select('StudenID,explode(split('Wrong,",")))
    .select(concat_ws(",",'StudenID,'col).as("key"))
    .withColumn("value",lit(0))
)


+-------------+-----+
|          key|value|
+-------------+-----+
|studentNo01,a|    1|
|studentNo01,b|    1|
|studentNo01,c|    1|
|studentNo02,c|    1|
|studentNo02,d|    1|
|studentNo01,x|    0|
|studentNo01,y|    0|
|studentNo01,z|    0|
|studentNo02,v|    0|
|studentNo02,w|    0|
+-------------+-----+

您可以按如下方式转换为RDD

val rdd = pair.map(r => (r.getString(0),r.getInt(1)))

【讨论】:

以上是关于如何在火花映射函数中输出多个(键,值)的主要内容,如果未能解决你的问题,请参考以下文章

如何比较字典值中的多个数组,并将每个数组元素的字典键映射到新数组/列表中

[PY3]——字典中的键如何映射多个值?字典如何排序?

如何将键映射到多个值到数据框列?

如何子查询 JPA 2.0 中多个键值组合的映射?

如何获取火花行的 value_counts?

在 Python 中,如何将多个项目映射到一个函数/值?