Spark数据帧语句在类定义中的工作方式不同

时间:2018-02-12 17:27:41

标签: sql scala class apache-spark

尝试创建spark-scala类以使用日历引用表。

我在Hadoop数据库上使用sql来创建Spark数据帧:

scala> val dfCyccal = sql(sqlCyccal)
dfCyccal: org.apache.spark.sql.DataFrame = [DT_WORKDAY: date, NWKD: int ... 4 more fields]

scala> dfCyccal.printSchema
root
 |-- DT_WORKDAY: date (nullable = true)
 |-- NWKD: integer (nullable = true)
 |-- DT_PREV_WD: date (nullable = true)
 |-- DT_NEXT_WD: date (nullable = true)
 |-- DT_MNTHEND: date (nullable = true)
 |-- ACCTG_MNTH: date (nullable = true)


scala> dfCyccal.show(5)
+----------+----+----------+----------+----------+----------+
|DT_WORKDAY|NWKD|DT_PREV_WD|DT_NEXT_WD|DT_MNTHEND|ACCTG_MNTH|
+----------+----+----------+----------+----------+----------+
|2004-01-29|  20|2003-12-30|2004-02-27|2004-01-29|2004-01-01|
|2004-01-30|   1|2003-12-31|2004-03-02|2004-02-27|2004-02-01|
|2004-02-02|   2|2004-01-02|2004-03-03|2004-02-27|2004-02-01|
|2004-02-03|   3|2004-01-05|2004-03-04|2004-02-27|2004-02-01|
|2004-02-04|   4|2004-01-06|2004-03-05|2004-02-27|2004-02-01|
+----------+----+----------+----------+----------+----------+
only showing top 5 rows

然后我为提取物设置了参考常量:

scala> val MIN_DT_WORKDAY : java.sql.Date = dfCyccal.agg(min('DT_WORKDAY)).first().getDate(0)
MIN_DT_WORKDAY: java.sql.Date = 2004-01-29

scala> val MAX_DT_WORKDAY : java.sql.Date = dfCyccal.agg(max('DT_WORKDAY)).first().getDate(0)
MAX_DT_WORKDAY: java.sql.Date = 2020-12-01

问题是,当我尝试将其封装在类定义中时,我得到了不同的结果:

class CYCCAL(parameters for SQL) { 
...
 val dfCyccal = sql(sqlCyccal).persist;

<console>:143: error: not found: value min
val MIN_DT_WORKDAY : java.sql.Date = dfCyccal.agg(min('DT_WORKDAY)).first().getDate(0)
                                                  ^
<console>:144: error: not found: value max
val MAX_DT_WORKDAY : java.sql.Date = dfCyccal.agg(max('DT_WORKDAY)).first().getDate(0)

}; // end of CYCCAL

类设置如何更改DataFrame上的操作?

2 个答案:

答案 0 :(得分:1)

他们的工作方式相同。 spark-shell默认情况下只导入许多对象,包括:

import org.apache.spark.sql.functions._
您自己的代码中缺少

答案 1 :(得分:0)

这很有用。我不得不在类定义中添加以下内容:

import org.apache.spark.sql.functions.{min,max};

我还必须从

更改列上的表示法
val MIN_DT_WORKDAY : java.sql.Date = dfCyccal.agg(min('DT_WORKDAY)).first().getDate(0)

val MIN_DT_WORKDAY : java.sql.Date = dfCyccal.agg(min("DT_WORKDAY")).first().getDate(0)

原件正在作为符号处理,您无法将功能应用于它。