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



我有"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|
+-------+-----+

只显示前3行

我想对一个人将使用哪些门进入建筑物进行基线"预测"。重要的是一个人是否在5 'x'单位内。

例如,foo将穿过门'a'和'b'。莫蒂会穿过"c"门和"d"门。而bar只会穿过e门。

到目前为止的进度:尝试使用:

向第二个DataFrame添加"potential exits"列
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来循环潜在的门,使用它们的名称来过滤doordf并获得其x值以与peopleDF中的x值进行比较时,我得到一个空指针异常。我读到这是因为我试图在嵌套的情况下使用过滤器。

对于可用的函数,一定有更好的方法来做到这一点,甚至可能不诉诸于udf或rdd,但它逃避了我。我已经做了很长时间了。

另外,我最初选择有一个潜在门的字符串(而不是一个数组)的原因是因为我发现它更容易处理我的目的,但我愿意接受建议。

任何帮助都是感激的!

我通过以下方法暂时解决了这个问题:

  • 将doorsDF DataFrame转换为行数组。比如doorsArr
  • 当将UDF应用于peopleDF以添加potentialDoor列时,我循环遍历该doorsArr数组,而不是尝试过滤/查询doors DF。

现在我能够成功地减少"潜在"池。

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

相关内容

  • 没有找到相关文章

最新更新