我用的是spark1.6。我尝试广播 RDD,但不确定如何访问数据帧中的广播变量?
我有两个数据框员工和部门。
员工数据框
-------------------
Emp Id | Emp Name | Emp_Age
------------------
1 | john | 25
2 | David | 35
部门数据框
--------------------
Dept Id | Dept Name | Emp Id
-----------------------------
1 | Admin | 1
2 | HR | 2
import scala.collection.Map
val df_emp = hiveContext.sql("select * from emp")
val df_dept = hiveContext.sql("select * from dept")
val rdd = df_emp.rdd.map(row => (row.getInt(0),row.getString(1)))
val lkp = rdd.collectAsMap()
val bc = sc.broadcast(lkp)
print(bc.value.get(1).get)
--Below statement doesn't work
val combinedDF = df_dept.withColumn("emp_name",bc.value.get($"emp_id").get)
- 如何在上面的combinedDF语句中引用广播变量?
- 如果lkp没有返回任何值怎么处理?
- 有没有办法从 lkp 返回多条记录(假设在查找中有 2 条 emp_id=1 的记录,我想获取这两条记录)
- 如何从广播返回多个值...(emp_name & emp_age)
如何在上面的combinedDF语句中引用广播变量?
Use udf
. If emp_id
is Int
val f = udf((emp_id: Int) => bc.value.get(emp_id))
df_dept.withColumn("emp_name", f($"emp_id"))
如果lkp没有返回任何值怎么处理?
不要使用get
如上图
有没有办法从lkp返回多条记录
Use groupByKey
:
val lkp = rdd.groupByKey.collectAsMap()
and explode
:
df_dept.withColumn("emp_name", f($"emp_id")).withColumn("emp_name", explode($"emp_name"))
或者直接跳过所有步骤broadcast
:
import org.apache.spark.sql.functions._
df_emp.join(broadcast(df_dep), Seq("Emp Id"), "left")
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)