Apache Spark запускается в выражении SQL - PullRequest
0 голосов
/ 03 января 2019

В API Apache Spark я могу использовать функцию startsWith для проверки значения столбца:

myDataFrame.filter(col("columnName").startsWith("PREFIX"))

Можно ли сделать то же самое в выражении Spark SQL и, если да, не могли бы вы показать пример?.

Ответы [ 3 ]

0 голосов
/ 03 января 2019

С помощью regexp_replace вы можете получить те же результаты без UDF. Проверьте это

scala> val df=Seq(("bPREFIX",1),("PREFIXb",2)).toDF("a","b")
df: org.apache.spark.sql.DataFrame = [a: string, b: int]

scala> df.show
+-------+---+
|      a|  b|
+-------+---+
|bPREFIX|  1|
|PREFIXb|  2|
+-------+---+


scala> df.filter(regexp_replace('a,"""^PREFIX.*""","")==="").show
+-------+---+
|      a|  b|
+-------+---+
|PREFIXb|  2|
+-------+---+


scala>

или с помощью regexp_extract ()

scala> df.filter(regexp_extract('a,"""(^PREFIX)""",1)==="PREFIX").show
+-------+---+
|      a|  b|
+-------+---+
|PREFIXb|  2|
+-------+---+


scala>

Использование функции instr ()

scala> df.filter("instr(a,'PREFIX')=1").show
+-------+---+
|      a|  b|
+-------+---+
|PREFIXb|  2|
+-------+---+


scala>
0 голосов
/ 04 января 2019

Я нашел следующее решение, которое работает с SQL-запросом Spark без специального UDP и из коробки, например:

CASE WHEN instr(PRICE_SOURCE_INDICATOR,'MAC') = 1
0 голосов
/ 03 января 2019

Вы можете создать UDF для этого

import org.apache.spark.sql.functions
val startsWith = udf((columnValue: String) => columnValue.startsWith("PREFIX"))

UDF получит столбец и проверит его по PREFIX, затем вы можете использовать его следующим образом:

myDataFrame.filter(startsWith($"columnName"))

Если вам нужен параметр в качестве префикса, вы можете использовать lit

val startsWith = udf((columnValue: String, prefix:String) => columnValue.startsWith(prefix))
myDataFrame.filter(startsWith($"columnName", lit("PREFIX")))

ПРИМЕР ВВОДА

+-----------+------+
|letter     |number|
+-----------+------+
|    PREFIXb|     1|
|    bPREFIX|     2|
+-----------+------+

ПРИМЕР ВЫХОДА

myDataFrame.filter(startsWith($"letter")).show
+-----------+------+
|letter     |number|
+-----------+------+
|    PREFIXb|     1|
+-----------+------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...