Spark:如何使用来自不同数据帧的嵌套数据来查找匹配(Scala)

时间:2016-10-18 03:14:40

标签: scala apache-spark apache-spark-sql spark-dataframe apache-spark-mllib

我有" doorsDF" var DataFrame,如下(简化):

+-----+-----+-----+------+
| door|    x|    y| usage|
+-----+-----+-----+------+
|    a|   32|   14|     5|
|    b|   28|   53|     1|
|    c|   65|   94|    23|
|    d|   68|   53|     1|
|    e|   51|   94|    12|
+-----+-----+-----+------+

我有" peopleDF" var DataFrame如下(简化):

+-------+-----+
| person|    x|
+-------+-----+
|    foo|   30|
|    bar|   66|
|  Morty|   52|
+-------+-----+

仅显示前三行

我想做一个基线'预测'一个人用来进入建筑物的门。重要的是,如果一个人在5&x; x'单位。

例如,foo会穿过门,然后走进大门。和' b'。莫蒂会穿过门,然后走进门口。并且' d'。和酒吧只会穿过门#。

到目前为止的进展:尝试添加一个"潜在退出"使用以下列的第二个DataFrame列:

val sequence = doorsDF.select("door").rdd.map(r => r(0)).collect().mkString(",")
val doorColumn = lit(sequence)    
peopleDF = peopleDF.withColumn("potentialDoors", doorColumn)

结果(new peopleDF):

+-------+-----+---------------+
| person|    x| potentialDoors|
+-------+-----+---------------+
|    foo|   30|      a,b,c,d,e|
|    bar|   66|      a,b,c,d,e|
|  Morty|   52|      a,b,c,d,e|
+-------+-----+---------------+

但是现在当我尝试使用udf来遍历潜在的门时,使用它们的名称来过滤doorsDF并将其x值与peopleDF中的x值进行比较,我得到一个nullpointer异常。我已经读过这是因为我试图在嵌套情况下使用过滤器。

必须有一个更好的方法来使用可用的功能,甚至可能不使用udf或rdd,但它逃避了我。我已经待了很长时间了。

另外,我最初选择拥有一系列潜在门(而不是阵列)的原因是因为我发现为了我的目的更容易处理,但我愿意接受建议。

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

我通过以下方式临时解决了这个问题:

  • 将doorsDF DataFrame转换为行数组。让我们说门阿尔尔
  • 当将UDF应用于peopleDF以添加potentialDoor列时,我遍历了尝试过滤/查询门DF的doorsArr数组INSTEAD。

现在我能够成功减少“潜在”池。

我不禁觉得这仍然是低效的,需要一些硬编码。所以我仍然愿意接受更清洁的建议!我想要更好地使用提供的功能。感谢您花时间阅读。