【发布时间】:2018-12-24 02:45:53
【问题描述】:
我正在尝试通过将描述写入 SQL 查询来验证 DataFrame 的数据类型,但每次我将日期时间作为字符串获取。
1.首先我尝试了以下代码:
SparkSession sparkSession=new SparkSession.Builder().getOrCreate();
Dataset<Row> df=sparkSession.read().option("header","true").option("inferschema","true").format("csv").load("/user/data/*_ecs.csv");
try {
df.createTempView("data");
Dataset<Row> sqlDf=sparkSession.sql("Describe data");
sqlDf.show(300,false);
Output:
+-----------------+---------+-------+
|col_name |data_type|comment|
+-----------------+---------+-------+
|id |int |null |
|symbol |string |null |
|datetime |string |null |
|side |string |null |
|orderQty |int |null |
|price |double |null |
+-----------------+---------+-------+
-
我也尝试自定义架构,但在这种情况下,当我执行除描述表之外的任何查询时,我会遇到异常:
SparkSession sparkSession=new SparkSession.Builder().getOrCreate(); Dataset<Row>df=sparkSession.read().option("header","true").schema(customeSchema).format("csv").load("/use/data/*_ecs.csv"); try { df.createTempView("trade_data"); Dataset<Row> sqlDf=sparkSession.sql("Describe trade_data"); sqlDf.show(300,false); Output: +--------+---------+-------+ |col_name|data_type|comment| +--------+---------+-------+ |datetime|timestamp|null | |price |double |null | |orderQty|double |null | +--------+---------+-------+
但是如果我尝试任何查询然后得到以下执行:
Dataset<Row> sqlDf=sparkSession.sql("select DATE(datetime),avg(price),avg(orderQty) from data group by datetime");
java.lang.IllegalArgumentException
at java.sql.Date.valueOf(Date.java:143)
at org.apache.spark.sql.catalyst.util.DateTimeUtils$.stringToTime(DateTimeUtils.scala:137)
如何解决?
【问题讨论】:
-
我使用的自定义模式:StructType customeSchema=new StructType(new StructField[] { new StructField("datetime",DataTypes.TimestampType,true,Metadata.empty()), new StructField("price ",DataTypes.DoubleType,true,Metadata.empty()), new StructField("orderQty",DataTypes.DoubleType,true,Metadata.empty())});
-
valueOfjavadoc 清楚地说明了何时抛出IllegalArgumentException。请验证您的数据。 docs.oracle.com/javase/8/docs/api/java/sql/… -
@DanW:你能说出为什么 inferschema 不起作用吗??
标签: java apache-spark dataframe apache-spark-sql