как получить правильную подстроку с помощью sql в spark 2.0

#apache-spark

#apache-spark

Вопрос:

например, если у меня есть значение столбца string, например «2.450», я хочу получить правильные 2 символа «50» из этого столбца, как получить его с помощью sql из spark 2.0.1. Я запускаю свой sql в представлении, созданном из фрейма данных

 mydf.createOrReplaceTempView("myview");
  

Комментарии:

1. почему -1 на мой вопрос?

Ответ №1:

Я вижу, что некоторые люди сказали, что должны ссылаться на документ HQL, затем я пробую substring с отрицательным аргументом, он работает. Это просто, но причина, которая усложняет ситуацию, заключается в том, что 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
  

Ответ №2:

Вы можете использовать UDF (определяемую пользователем функцию) для достижения следующего результата.

 df =sqlCtx.sql("select getChar(column name) from myview");
  

здесь приведенный выше код вызовет UDF «getChar ()» и передаст имя столбца в представлении myview в udf.

UDF может выполнять все вычисления и возвращать последние две цифры для всех переданных цифр.

вам также необходимо зарегистрировать UDF.

 public  static UDF1<Float, Integer> getChar =  new UDF1<Float, Integer>() {
    public Integer call(Float input_data, String Output_data){

      //write your logic here
       Output_data =
    }

}
  

Ответ №3:

Вы можете использовать regexp_extract для получения двух правильных символов из фрейма данных:

 def GetTwoChar(): Unit = {
  val sqlContext: SQLContext = new org.apache.spark.sql.SQLContext(sc)

  // dummy data
  val r1 = Input("mkda2")
  val r2 = Input("xksj1")

  val records = Seq(r1, r2)
  val df = sqlContext.createDataFrame(records)

  df.select(regexp_extract(df.col("text"), ".*([A-Za-z0-9]{2}$)", 1) as "twochars").show()
}

case class Input(text: String)
  

Вывод:

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