【发布时间】:2017-04-07 19:04:12
【问题描述】:
我有两个数据框,为简单起见,让我们左右调用它们,我将只显示示例结构。
数据框“左”:(这个数据框很大)
源代码 |夏令时 ------------ 乙 |一种 c | b 一个 | C数据框“正确”(这个数据框很小)
位置 |姓名 ------------ 一个 |伦敦 乙 |巴黎这两个数据框都是使用 hive 上下文和 sql 语句创建的。
如果我按如下方式在左侧数据帧上运行连接,一切正常:
left.join(right, left("src") === right("loc"), "left_outer")
这会按预期返回一个带有联接的数据框
我实际上想要做的是在 col1 和 col2 上进行匹配,实际上试图返回以下内容
源代码 | dst | src_loc | src_name | dst_loc | dst_name -------------------------------------------------- - 乙 |一个 |乙 |巴黎 |一个 |伦敦 c |乙 |空 |空 |乙 |巴黎 一个 | c |一个 |伦敦 |空 |空值如果我尝试按如下方式在数据帧上执行此操作,整个 Spark 作业就会失败,它不会出错,但它要么花费的时间太长,要么发生了我不明白的事情。
val dfjoin1 = left.join(right, left("src") === right("loc"), "left_outer")
dfjoin1.join(right, dfjoin1("dst") === right("loc"), "left_outer")
出于沮丧,我尝试从第二个相同的 hive 查询中创建一个新的数据帧,而不是重复使用正确的数据帧
以下工作,但对我来说似乎非常错误(不应该为相同的数据调用 hive 两次)
val right = hiveContext.sql(FROM .....)
val right2 = hiveContext.sql(FROM .....)
val dfjoin1 = left.join(right, left("src") === right("loc"), "left_outer")
dfjoin1.join(right2, dfjoin1("dst") === right2("loc"), "left_outer")
我遇到的 ext 问题是我想过滤已添加的列,为了论证,假设我想获取所有 src loc 名称为 Paris 的列。
dfjoin1.filter($"name" === "Paris")
由于列名不明确,此操作失败。我该如何解决这个问题?作为连接的一部分,我可以轻松地为列添加名称前缀吗?
【问题讨论】:
标签: scala apache-spark apache-spark-sql spark-dataframe