![](/img/trans.png)
[英]Spark - query dataframe based on values from a column in another dataframe
[英]Pass date values from dataframe to query in Spark /Scala
我有一個 dataframe 有一個日期列,值如下。
df.show()
+----+----------+
|name| dob|
+----+----------+
| Jon|2001-04-15|
| Ben|2002-03-01|
+----+----------+
Now i need to query a table in hive which has "dob" from above dataframe (both 2001-04-15, 2002-03-01).So I need to pass the values under dob column as a parameter to my hive query.
我試圖將這些值收集到如下所示的變量中,該變量為我提供了字符串數組。
val dobRead = df.select("updt_d").distinct().as[String].collect()
dobRead: Array[String] = Array(2001-04-15, 2002-03-01)
但是,當我嘗試傳遞給查詢時,我發現它沒有正確替換並出現錯誤。
val tableRead = hive.executeQuery(s"select emp_name,emp_no,martial_status from <<table_name>> where dateOfBirth in ($dobRead)")
org.apache.hadoop.hive.ql.metadata.HiveException: Failed to compile query: org.apache.hadoop.hive.ql.parse.ParseException: line 1:480 cannot recognize input near '(' '[' 'Ljava' in expression specification
您能幫我如何將日期值傳遞給 Spark 中的查詢嗎?
您可以按如下方式收集日期( Row.getAs ):
val rows: Array[Row] = df.select("updt_d").distinct().collect()
val dates: Array[String] = rows.map(_.getAs[String](0))
然后構建查詢:
val hql: String = s"select ... where dateOfBirth in (${
dates.map(d => s"'${d}'").mkString(", ")
})"
如果第一個 DataFrame 中的日期數量太大,則應使用連接操作,而不是將它們收集到驅動程序中。
首先,將每個表加載為 DataFrame(我將它們dfEmp
和dfDates
)。 然后,您可以加入要過濾的日期字段,或者使用標准inner
連接加上過濾掉 null 字段,或者直接使用left_semi
連接:
val dfEmp = hiveContext.table("EmpTable")
val dfEmpFiltered = dfEmp.join(dfDates,
col("dateOfBirth") === col("updt_d"), "left_semi")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.