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

标签 scala apache-spark apache-spark-sql

我用的是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 返回多条记录(假设在查找中有 2 条 emp_id=1 的记录,我想获取这两条记录)
  4. 如何从广播中返回多个值...(emp_name 和 emp_age)

最佳答案

How do I refer the broadcast variable in the above combinedDF statement?

使用udf。如果emp_idInt

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

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

How to handle if the lkp doesn't return any value?

不要使用如上所示的get

Is there a way to return multiple records from the lkp

使用groupByKey:

val lkp = rdd.groupByKey.collectAsMap()

爆炸:

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

或者直接跳过所有步骤并广播:

import org.apache.spark.sql.functions._

df_emp.join(broadcast(df_dep), Seq("Emp Id"), "left")

关于scala - 如何在数据帧中引用广播变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41337553/

相关文章:

scala - spark 使用带有选项字段的案例类将数据帧转换为数据集

scala - 如何使用scalafmt为模式匹配语法中的情况配置alignToken?

scala - 如何在 Spark 2.0+ 中编写单元测试?

apache-spark - spark-2.0.3中的spark.sql.shuffle.partitions无效

scala - Scala Actor 和环境引用

scala - 在 IntelliJ 中使用 Scala 工作表很困难

scala - 更改 Spark 数据框中列值的日期格式

scala - 带有 Spark 和 Cassandra 的 SBT 应用程序 - 类路径中缺少符号 'type <none>.package.DataFrame'

apache-spark - 在 pyspark 中查找并删除匹配的列值

apache-spark - 按列分区但保持固定分区计数的有效方法是什么?