我有以下SparkSQL:
val resultDf = spark.sql("SELECT name, phone, country FROM users")
我想按以下集合中存在的国家/地区过滤返回的记录:
val countries = Seq("Italy", "France", "United States", "Poland", "Spain")
例如,我可以基于集合创建广播变量:
val countriesBroadcast = sc.broadcast(countries)
但是在我的SQL查询中可以使用countriesBroadcast
变量吗?(如果可以,如何?)
答案 0 :(得分:2)
除UserDefinedFunctions
,UserDefinedAggregateFunctions
和Aggregators
(即非声明性代码)外,这是不可能的。
要通过DataFrame
/ SQL API使用广播,应使用DataFrames
并使用广播提示-Spark SQL broadcast hash join。
答案 1 :(得分:1)
在spark数据框API中,我们可以广播整个表,可以将其与目标表连接以获得所需的输出。这是示例代码。
进口
import org.apache.spark.sql.functions.broadcast
代码
val spark = SparkSession.builder().master("local").getOrCreate()
val df = spark.read.option("header", true).csv("data/user.txt")
df.createOrReplaceTempView("users")
val countries = Seq("Italy", "France", "United States", "Poland", "Spain")
import spark.implicits._
spark.sparkContext.parallelize(countries, 1).toDF("country").createOrReplaceTempView("countries")
broadcast(spark.table("countries")).join(spark.table("users"), "country").show()
“ data / user.txt”文件内容
name,phone,country
a,123,India
b,234,Italy
c,526,France
d,765,India
代码输出:
+-------+----+-----+
|country|name|phone|
+-------+----+-----+
| Italy| b| 234|
| France| c| 526|
+-------+----+-----+
注意:代码已在Spark 2.2和Scala 2.11中进行了测试