Как реализовать & ldquo; else if & rdquo; на искровом каркасе без UDF? [Дубликат]

вы можете использовать смещение

SELECT name FROM mydb ORDER BY score DESC LIMIT 10 OFFSET 10

здесь, смещение указывает, откуда, где будут отображаться следующие 10 данных. вы также можете использовать ниже:

SELECT name FROM mydb ORDER BY score DESC LIMIT 10, 10
1
задан flybonzai 19 April 2016 в 21:15
поделиться

1 ответ

Если вы хотите, вы можете использовать прямое выражение SQL:

expr = """
    CASE
        WHEN user_agent LIKE \'%Android%\' THEN \'mobile\'
        WHEN user_agent LIKE \'%Linux%\' THEN \'desktop\'
        ELSE \'other_unknown\'
    END AS user_agent_type"""

df = sc.parallelize([
    (1, "Android"), (2, "Linux"), (3, "Foo")
]).toDF(["id", "user_agent"])

df.selectExpr("*", expr).show()
## +---+----------+---------------+
## | id|user_agent|user_agent_type|
## +---+----------+---------------+
## |  1|   Android|         mobile|
## |  2|     Linux|        desktop|
## |  3|       Foo|  other_unknown|
## +---+----------+---------------+

, иначе вы можете заменить его комбинацией when и like и otherwise:

from pyspark.sql.functions import col, when
from functools import reduce

c = col("user_agent")
vs = [("Android", "mobile"), ("Linux", "desktop")]
expr = reduce(
    lambda acc, kv: when(c.like(kv[0]), kv[1]).otherwise(acc), 
    vs, 
    "other_unknown"
).alias("user_agent_type")

df.select("*", expr).show()

## +---+----------+---------------+
## | id|user_agent|user_agent_type|
## +---+----------+---------------+
## |  1|   Android|         mobile|
## |  2|     Linux|        desktop|
## |  3|       Foo|  other_unknown|
## +---+----------+---------------+

Вы также можете добавить несколько столбцов в один select:

exprs = [c.alias(a) for (a, c) in [
  ('etl_requests_usage', lit('DEV')), 
  ('etl_datetime_local', current_date())]]

df.select("*", *exprs)
3
ответ дан zero323 23 August 2018 в 23:40
поделиться