在 Spark SQL DSL 中计算字符串长度
compute string length in Spark SQL DSL
编辑:这是一个关于 Spark 1.2 的老问题
我一直在尝试动态计算 SchemaRDD 中字符串列的长度以用于 orderBy 目的。我正在学习 Spark SQL 所以我的问题严格来说是关于使用 DSL 或 Spark SQL 公开的 SQL 接口,或者了解它们的局限性。
我的第一次尝试是使用集成关系查询,例如
notes.select('note).orderBy(length('note))
编译失败:
error: not found: value length
(这让我想知道在哪里可以找到 "Expression" 这个 DSL 实际可以解析的内容。例如,它解析“+”以进行列添加。)
然后我试了
sql("SELECT note, length(note) as len FROM notes")
这失败了
java.util.NoSuchElementException: key not found: length
(然后我重读了这个(我是 运行 1.2.0)
http://spark.apache.org/docs/1.2.0/sql-programming-guide.html#supported-hive-features
并想知道 Spark SQL 在何种意义上支持列出的配置单元功能。)
问题: SQL 语句中的表达式 and/or 是否真的支持长度运算符?如果是,语法是什么? (奖励:是否有关于 Spark SQL 表达式中解析的内容的特定文档,以及一般的语法是什么?)
谢谢!
在 Spark 中试试这个 Shell:
case class Note(id:Int,text:String)
val notes=List(Note(1,"One"),Note(2,"Two"),Note(3,"Three"))
val notesRdd=sc.parallelize(notes)
import org.apache.spark.sql.hive.HiveContext
val hc=new HiveContext(sc)
import hc.createSchemaRDD
notesRdd.registerTempTable("note")
hc.sql("select id, text, length(text) from note").foreach(println)
它通过设置工作(开箱即用的 spark 1.2.1 和 hadoop 2.4):
[2,Two,3]
[1,One,3]
[3,Three,5]
它现在存在!
你的 spark.sql("SELECT note, LENGTH(note) as len FROM notes")
应该可以。
我是 运行 Spark 2.2.0,刚刚完成并成功了。
编辑:这是一个关于 Spark 1.2 的老问题
我一直在尝试动态计算 SchemaRDD 中字符串列的长度以用于 orderBy 目的。我正在学习 Spark SQL 所以我的问题严格来说是关于使用 DSL 或 Spark SQL 公开的 SQL 接口,或者了解它们的局限性。
我的第一次尝试是使用集成关系查询,例如
notes.select('note).orderBy(length('note))
编译失败:
error: not found: value length
(这让我想知道在哪里可以找到 "Expression" 这个 DSL 实际可以解析的内容。例如,它解析“+”以进行列添加。)
然后我试了
sql("SELECT note, length(note) as len FROM notes")
这失败了
java.util.NoSuchElementException: key not found: length
(然后我重读了这个(我是 运行 1.2.0) http://spark.apache.org/docs/1.2.0/sql-programming-guide.html#supported-hive-features 并想知道 Spark SQL 在何种意义上支持列出的配置单元功能。)
问题: SQL 语句中的表达式 and/or 是否真的支持长度运算符?如果是,语法是什么? (奖励:是否有关于 Spark SQL 表达式中解析的内容的特定文档,以及一般的语法是什么?)
谢谢!
在 Spark 中试试这个 Shell:
case class Note(id:Int,text:String)
val notes=List(Note(1,"One"),Note(2,"Two"),Note(3,"Three"))
val notesRdd=sc.parallelize(notes)
import org.apache.spark.sql.hive.HiveContext
val hc=new HiveContext(sc)
import hc.createSchemaRDD
notesRdd.registerTempTable("note")
hc.sql("select id, text, length(text) from note").foreach(println)
它通过设置工作(开箱即用的 spark 1.2.1 和 hadoop 2.4):
[2,Two,3]
[1,One,3]
[3,Three,5]
它现在存在!
你的 spark.sql("SELECT note, LENGTH(note) as len FROM notes")
应该可以。
我是 运行 Spark 2.2.0,刚刚完成并成功了。