The*_*ron 3 sql scala apache-spark apache-spark-sql
在Spark中,我试图在一个临时表上执行SQL查询,该临时表是通过读取csv文件并将列转换为正确的数据类型手动构建的数据框派生的.
具体来说,我所说的表是来自[TPC-H规范] [1]的LINEITEM表.与规范中所述不同,我使用TIMESTAMP而不是DATE,因为我已经读过Spark不支持DATE类型.
在我的单个scala源文件中,在创建数据框并注册名为"lineitem"的临时表之后,我尝试执行以下查询:
val res = sqlContext.sql("SELECT * FROM lineitem l WHERE date(l.shipdate) <= date('1998-12-01 00:00:00');")
Run Code Online (Sandbox Code Playgroud)
当我使用spark-submit提交打包的jar时,我收到以下错误:
线程"main"中的异常java.lang.RuntimeException:[1.75]失败:``union''期望但是`;'' 发现
当我省略分号并做同样的事情时,我收到以下错误:
线程"main"中的异常java.util.NoSuchElementException:找不到键:date
Spark版本是1.4.0.
有谁知道这些查询有什么问题?
[1] http://www.tpc.org/TPC_Documents_Current_Versions/pdf/tpch2.17.1.pdf
SQLContext.sql不应使用分号分隔 - 这是您第一个问题的来源DATEUDF期望YYYY-MM-DD表单中的日期并DATE('1998-12-01 00:00:00')评估为null.只要timestamp可以转换为DATE正确的查询字符串,如下所示:
"SELECT * FROM lineitem l WHERE date(l.shipdate) <= date('1998-12-01')"
Run Code Online (Sandbox Code Playgroud)DATE是一个Hive UDF.这意味着你必须使用HiveContext不是标准SQLContext- 这是你第二个问题的根源.
import org.apache.spark.sql.hive.HiveContext
val sqlContext = new HiveContext(sc) // where sc is a SparkContext
Run Code Online (Sandbox Code Playgroud)在Spark> = 1.5中,也可以使用to_date函数:
import org.apache.spark.sql.functions.{lit, to_date}
df.where(to_date($"shipdate") <= to_date(lit("1998-12-01")))
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
6878 次 |
| 最近记录: |