#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|
--------