Apache spark 如何在spark 2.0中使用sql获取正确的子字符串

Apache spark 如何在spark 2.0中使用sql获取正确的子字符串,apache-spark,Apache Spark,e、 g.如果我有一个字符串列值,如“2.450”,我想从这个列中获得两个字符“50”,如何使用spark 2.0.1中的sql获得它 我正在对从dataframe创建的视图运行sql mydf.createOrReplaceTempView("myview"); 您可以使用UDF(用户定义函数)来实现以下功能 结果 在这里,上面的代码将调用一个UDF“getChar()”,并将视图myview中的列名传递给UDF UDF可以执行所有计算,并返回所有传递数字的最后两位数字 您还需要注册UDF

e、 g.如果我有一个字符串列值,如“2.450”,我想从这个列中获得两个字符“50”,如何使用spark 2.0.1中的sql获得它 我正在对从dataframe创建的视图运行sql

mydf.createOrReplaceTempView("myview");
您可以使用UDF(用户定义函数)来实现以下功能 结果

在这里,上面的代码将调用一个UDF“getChar()”,并将视图myview中的列名传递给UDF

UDF可以执行所有计算,并返回所有传递数字的最后两位数字

您还需要注册UDF

publicstaticudf1 getChar=newudf1(){
公共整数调用(浮点输入数据、字符串输出数据){
//把你的逻辑写在这里
输出数据=
}
}

您可以使用
regexp\u extract
从数据帧中获取两个正确的字符:

def GetTwoChar():单位={
val sqlContext:sqlContext=new org.apache.spark.sql.sqlContext(sc)
//虚拟数据
val r1=输入(“mkda2”)
val r2=输入(“xksj1”)
val记录=序号(r1,r2)
val df=sqlContext.createDataFrame(记录)
df.select(regexp_extract(df.col(“text”),“*([A-Za-z0-9]{2}$)”,1)作为“twochars”).show()
}
案例类输入(文本:字符串)
输出为:

+--------+
|twochars|
+--------+
|      a2|
|      j1|
+--------+

我看到一些人说应该参考HQL文档,然后我尝试使用否定参数的子字符串,它可以工作。这很简单,但使事情变得复杂的原因是spark sql没有文档。我认为这不是一个好主意,对于许多想使用spark sql的人来说,这不是一个好主意

scala> val df = spark.sql("select a, substring(a,-2) as v from cdr");
df: org.apache.spark.sql.DataFrame = [a: string, v: string]

scala> df.show()
+-----------+---+
|a          |  v|
+-----------+---+
|      4.531| 31|
|      4.531| 31|
|      1.531| 31|
|      1.531| 31|
|      1.531| 31|
|      1.531| 31|
|      1.531| 31|
|      3.531| 31|
|      1.531| 31|
|      1.531| 31|
|      1.531| 31|
|      1.431| 31|
|      1.531| 31|
|      1.633| 33|
|      1.531| 31|
|      3.531| 31|
|      1.531| 31|
|      3.531| 31|
|      1.531| 31|
|      4.531| 31|
+-----------+---+
only showing top 20 rows

为什么我的问题是-1?
+--------+
|twochars|
+--------+
|      a2|
|      j1|
+--------+
scala> val df = spark.sql("select a, substring(a,-2) as v from cdr");
df: org.apache.spark.sql.DataFrame = [a: string, v: string]

scala> df.show()
+-----------+---+
|a          |  v|
+-----------+---+
|      4.531| 31|
|      4.531| 31|
|      1.531| 31|
|      1.531| 31|
|      1.531| 31|
|      1.531| 31|
|      1.531| 31|
|      3.531| 31|
|      1.531| 31|
|      1.531| 31|
|      1.531| 31|
|      1.431| 31|
|      1.531| 31|
|      1.633| 33|
|      1.531| 31|
|      3.531| 31|
|      1.531| 31|
|      3.531| 31|
|      1.531| 31|
|      4.531| 31|
+-----------+---+
only showing top 20 rows