我正在尝试运行一个' SQL'查询Spark DataFrame。我已经将df的名称注册为表,现在我正在尝试在我应用udf的列上运行select,然后拾取通过某个条件的行。
问题是我的WHERE
子句引用了修改后的列,但无法看到用AS
声明的名称。
DataFrame df = sqlContext.read()
.format("com.databricks.spark.csv")
.option("header", "true")
.option("delimiter", delimiter)
.load(path);
df.registerTempTable("df");
String sqlDfQuery = "SELECT parseDateTime(start) as start1 FROM df WHERE start1 > 1";
if (sqlContext.sql(sqlDfQuery).take(1) != null) return true;
当我跑步时,我正在回来
org.apache.spark.sql.AnalysisException:无法解析' start1'给定输入栏:[分数,开始,......
parseDateTime
是一个像那样定义的UDF
sqlContext.udf().register("parseDateTime", (String dt) -> new DateTime(dt).getMillis(), DataTypes.LongType);
我不应该这样做吗?
答案 0 :(得分:0)
这是因为它在别名之前应用过滤器。
您可以执行嵌套的select语句来解决此问题。 如下所示:
String sqlDfQuery = "SELECT start1 FROM (
SELECT parseDateTime(start) AS start1 FROM df) TMP
WHERE start1 > 1 ";