Как использовать ключевое слово LEFT и RIGHT в SPARK SQL

#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, которые являются более гибкими и безопасными для ввода.