假设我正在从共享数据存储创建一个spark数据集,如下所示:
Dataset<Row> item = spark.read().option("delimiter", "|").option("header","true").csv(fName).cache();
有没有办法告诉Spark向所有节点广播项目,以便不需要随机播放它?我有一堆小查找表,我想看看它们是否有助于避免随机播放。
答案 0 :(得分:3)
您可以使用两种方法:
collect()
给定数据集并手动广播。你说这些文件很小,所以它是可能的。但是,它适用于UDF /强类型运算符,如map
,而不是标准函数。示例:
val items = item.as[MyCaseClass].collect()
val itemsBcV = sparkContext.broadcast(items)
// later, UDF
val funnyUDF = udf ((x : String) => {
val valueFromBroadcast = itemsBcV.value;
// processing
});
首先,导入org.apache.spark.sql.functions._
例如:
someBigTable.join(broadcast(item), "id")
在纯SQL语法中是:
item.createOrReplaceTempView("item")
select /*+ BROADCAST(item) */ * from bigTable join item
Spark将管理广播此变量并使用更快的广播哈希加入而不是哈希加入或排序合并加入