如何在数据帧中引用广播变量

时间:2016-12-27 00:19:31

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

我使用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)
  1. 如何在上面的combinedDF语句中引用广播变量?
  2. 如果lkp没有返回任何值,如何处理?
  3. 有没有办法从lkp返回多个记录(假设在查找中有emp_id = 1的2条记录,我想得到两条记录)
  4. 如何从广播中返回多个值...(emp_name& emp_age)

1 个答案:

答案 0 :(得分:4)

  

如何在上面的combinedDF语句中引用广播变量?

使用udf。如果emp_idInt

val f = udf((emp_id: Int) =>  bc.value.get(emp_id))

df_dept.withColumn("emp_name", f($"emp_id"))
  

如果lkp没有返回任何值,如何处理?

如上所示,不要使用get

  

有没有办法从lkp

返回多个记录

使用groupByKey

val lkp = rdd.groupByKey.collectAsMap()

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")