如何在Spark DataFrameSQL

时间:2018-11-09 09:30:50

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

我有以下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变量吗?(如果可以,如何?)

2 个答案:

答案 0 :(得分:2)

UserDefinedFunctionsUserDefinedAggregateFunctionsAggregators(即非声明性代码)外,这是不可能的。

要通过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中进行了测试