вы можете использовать смещение
SELECT name FROM mydb ORDER BY score DESC LIMIT 10 OFFSET 10
здесь, смещение указывает, откуда, где будут отображаться следующие 10 данных. вы также можете использовать ниже:
SELECT name FROM mydb ORDER BY score DESC LIMIT 10, 10
Если вы хотите, вы можете использовать прямое выражение 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)