【问题标题】:What the equivalent of OFFSET in Spark SQL?Spark SQL 中的 OFFSET 等价物是什么?
【发布时间】:2017-04-07 09:00:19
【问题描述】:

我使用 Spark SQL 得到了一个包含 100 行的结果集。我想从第 6 行到第 15 行得到最终结果。在 SQL 中,我们使用 OFFSET 跳过行,如 OFFSET 5 LIMIT 10 用于从第 6 行到第 15 行获取行。在 Spark SQL 中,我怎样才能达到相同的效果?

【问题讨论】:

  • 您可以在 Spark SQL 中输入原始 SQL,那么什么不适合您?
  • (SELECT name, address FROM table WHERE city = 'Dallas') UNION (SELECT name, address FROM table WHERE city ='Phoenix') OFFSET 5 LIMIT 10 。我收到Exception in thread "main" org.apache.spark.sql.catalyst.parser.ParseException: mismatched input 'OFFSET' expecting {<EOF>, ',', '.', '[', 'LIMIT', 'OR', 'AND', 'IN', NOT, 'BETWEEN', 'LIKE', RLIKE, 'IS', 'NULLS', 'ASC', 'DESC', 'WINDOW', EQ, '<=>', '<>', '!=', '<', LTE, '>', GTE, '+', '-', '*', '/', '%', 'DIV', '&', '|', '^', 'SORT', 'CLUSTER', 'DISTRIBUTE'}(line 1, pos 407) 可能我错过了什么。
  • OFFSET 在 Spark SQL 中工作吗?
  • 该错误似乎表明它没有。顺便说一句,这是昨天问的。 stackoverflow.com/questions/42560815/…
  • 非常感谢您向我指出这一点。

标签: apache-spark apache-spark-sql spark-dataframe


【解决方案1】:

我猜 SparkSQL 不支持 offset。所以我使用 id 作为过滤条件。每次,我只检索 N 个数据。

以下是我的示例代码:

sc = SparkContext()  
sqlContext = SQLContext(sc)

df = sqlContext.read.format('com.databricks.spark.csv')\
        .options(header='false', inferschema='true')\
        .load('your.csv')
sqlContext.registerDataFrameAsTable(df, "table")

batch_size = 10 ** 5
res = sqlContext.sql("select min(C0), max(C0) from table).collect()
index = int(res[0]._c0) - 1
N_max = int(res[0]._c1)
while index < N_max:
    prev = index
    sql = "select C0, C1, C2, C3 from table \
            where C0 > '%s' and C0 <= '%s' \
            order by C0 limit %d" % (index, index+batch_size, batch_size)
    res = sqlContext.sql(sql).collect()
    # do something ...

    if index < prev + batch_size:
        index = prev + batch_size

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    相关资源
    最近更新 更多