#mysql #apache-spark #pyspark
#scala #apache-spark #apache-spark-sql
Вопрос:
Я новичок в spark SQL,
В MS SQL у нас есть ключевое слово LEFT, LEFT(Columnname,1) in('D','A') then 1 else 0
.
Как реализовать то же самое в SPARK SQL.
Комментарии:
1. Если вы используете JDBC для сервера MS SQL, то вы можете выполнить точно такую же инструкцию
2. Я считываю данные из Parquet table из Azure, я хочу знать, как ключевое слово LEFT в SPARK SQL @cricket_007
Ответ №1:
Вы можете использовать substring
функцию с положительным pos
значением для взятия слева:
import org.apache.spark.sql.functions.substring
substring(column, 0, 1)
и отрицательное pos
значение для взятия справа:
substring(column, -1, 1)
Итак, в Scala вы можете определить
import org.apache.spark.sql.Column
import org.apache.spark.sql.functions.substring
def left(col: Column, n: Int) = {
assert(n >= 0)
substring(col, 0, n)
}
def right(col: Column, n: Int) = {
assert(n >= 0)
substring(col, -n, n)
}
val df = Seq("foobar").toDF("str")
df.select(
Seq(left _, right _).flatMap(f => (1 to 3).map(i => f($"str", i))): _*
).show
-------------------- -------------------- -------------------- --------------------- --------------------- ---------------------
|substring(str, 0, 1)|substring(str, 0, 2)|substring(str, 0, 3)|substring(str, -1, 1)|substring(str, -2, 2)|substring(str, -3, 3)|
-------------------- -------------------- -------------------- --------------------- --------------------- ---------------------
| f| fo| foo| r| ar| bar|
-------------------- -------------------- -------------------- --------------------- --------------------- ---------------------
Аналогично в Python:
from pyspark.sql.functions import substring
from pyspark.sql.column import Column
def left(col, n):
assert isinstance(col, (Column, str))
assert isinstance(n, int) and n >= 0
return substring(col, 0, n)
def right(col, n):
assert isinstance(col, (Column, str))
assert isinstance(n, int) and n >= 0
return substring(col, -n, n)
Ответ №2:
import org.apache.spark.sql.functions._
Используйте substring(column, 0, 1)
вместо LEFT
функции.
где
- 0: начальная позиция в строке
- 1: Количество выбираемых символов
Пример: Рассмотрим функцию LEFT :
LEFT(upper(SKU),2)
Соответствующий оператор SparkSQL будет :
substring(upper(SKU),1,2)
Ответ №3:
Чтобы использовать ответ пользователя 6910411, вы также можете использовать isin, а затем создать новый столбец с результатом вашего сравнения символов.
Окончательный полный код будет выглядеть примерно так
import org.apache.spark.sql.functions._
df.select(substring($"Columnname", 0, 1) as "ch")
.withColumn("result", when($"ch".isin("D", "A"), 1).otherwise(0))
Ответ №4:
Начиная с Spark 2.3, существуют Spark SQL right
и left
функции
Предположим, у вас есть следующий фрейм данных.
----------------------
|some_string |
----------------------
|this 23 has 44 numbers|
|no numbers |
|null |
----------------------
Вот как получить два крайних левых элемента с помощью функции SQL left
:
df.select(expr("left(some_string, 2)").as("left_two")).show(false)
--------
|left_two|
--------
|th |
|no |
|null |
--------
Передача строк SQL в expr()
не идеальна. Пользователи Scala API не хотят иметь дело с форматированием строк SQL.
Я создал библиотеку под названием bebe, которая обеспечивает легкий доступ к функции left:
df.select(bebe_left(col("some_string"), lit(2)).as("left_two")).show()
--------
|left_two|
--------
|th |
|no |
|null |
--------
Функции Spark SQL right
и bebe_right
работают аналогичным образом.
Вы можете использовать функции Spark SQL с помощью expr
взлома, но лучше использовать функции bebe, которые являются более гибкими и безопасными для ввода.