簡體   English   中英

從 dataframe 傳遞日期值以在 Spark /Scala 中查詢

[英]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(", ")
})"

選項 2

如果第一個 DataFrame 中的日期數量太大,則應使用連接操作,而不是將它們收集到驅動程序中。

首先,將每個表加載為 DataFrame(我將它們dfEmpdfDates )。 然后,您可以加入要過濾的日期字段,或者使用標准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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM