计算Spark SQL DSL中的字符串长度

Wil*_*ton 5 string-length apache-spark apache-spark-sql

编辑:这是一个关于Spark 1.2的老问题

为了达到目的,我一直在尝试计算SchemaRDD中字符串列的长度.我正在学习Spark SQL,所以我的问题严格来说是使用Spark或Spark SQL公开的SQL接口,或者了解它们的局限性.

我的第一次尝试就是使用集成的关系查询

notes.select('note).orderBy(length('note))
Run Code Online (Sandbox Code Playgroud)

在编译时没有运气:

error: not found: value length
Run Code Online (Sandbox Code Playgroud)

(这让我想知道在哪里可以找到这个DSL实际上可以解决的"表达式".例如,它为列添加解析了"+".)

然后我试了一下

sql("SELECT note, length(note) as len FROM notes")
Run Code Online (Sandbox Code Playgroud)

这失败了

java.util.NoSuchElementException: key not found: length
Run Code Online (Sandbox Code Playgroud)

(然后我重读了这个(我正在运行1.2.0) http://spark.apache.org/docs/1.2.0/sql-programming-guide.html#supported-hive-features 并想知道Spark SQL是什么意思支持列出的蜂巢功能.)

问题:表达式和/或SQL语句中真正支持的长度运算符是什么?如果是,语法是什么?(奖励:是否有关于Spark SQL Expressions中解决的内容的特定文档,以及一般的语法是什么?)

谢谢!

G Q*_*ana 6

在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)
Run Code Online (Sandbox Code Playgroud)

它通过设置工作(开箱即用的火花1.2.1与hadoop 2.4):

[2,Two,3]
[1,One,3]
[3,Three,5]
Run Code Online (Sandbox Code Playgroud)

  • ...并且为了记录,有人向我展示了我想要的表达式中允许的运算符[here(aggregates)](https://github.com/apache/spark/blob/master/sql/catalyst/src/main /scala/org/apache/spark/sql/catalyst/expressions/aggregates.scala)和[here(arithmetic)](https://github.com/apache/spark/blob/master/sql/catalyst/src/main /scala/org/apache/spark/sql/catalyst/expressions/arithmetic.scala).字符串没有长度操作...... (2认同)

car*_*mom 5

它现在存在!

spark.sql("SELECT note, LENGTH(note) as len FROM notes")应该工作。

我正在运行 Spark 2.2.0,刚刚完成并且成功了。