【问题标题】:Apache Livy: query Spark SQL via REST: possible?Apache Livy:通过 REST 查询 Spark SQL:可能吗?
【发布时间】:2017-08-16 00:08:39
【问题描述】:

Apache Livy 文档很少:是否可以使用 Apache Livy 将 Spark SQL 查询结果集作为 REST 调用返回?调用应用程序是移动的,它不能使用 odbc/jdbc 进行连接。所以 Spark thriftserver 不是一个选择。

【问题讨论】:

  • 是的,可以通过 livy 使用 spark SQL 进行查询,但目前无法发出纯 SQL。 SQL 需要用 Python、scala 或 java 包装。 Livy 结果可以使用 JSON 等相对未记录的特征进行格式化。回到笔记本电脑时,我会提供更好的答案:)

标签: apache-spark


【解决方案1】:

是的,可以通过 Livy 提交 Spark SQL 查询。但是,[当前] 不支持自行提交的查询。它们需要用 Python 或 Scala 代码包装。

下面是两个使用 Python 执行 Spark SQL 查询的示例,通过 requests lib 和 Scala 代码作为要“在 spark”中执行的字符串与 Livy 进行交互:

1) 在 livy (https://github.com/apache/incubator-livy/blob/412ccc8fcf96854fedbe76af8e5a6fec2c542d25/repl/src/test/scala/org/apache/livy/repl/PythonInterpreterSpec.scala#L91) 中使用 %json 魔法

session_url = host + "/sessions/1"
statements_url = session_url + '/statements'
data = {
        'code': textwrap.dedent("""\
        val d = spark.sql("SELECT COUNT(DISTINCT food_item) FROM food_item_tbl")
        val e = d.collect
        %json e
        """)}
r = requests.post(statements_url, data=json.dumps(data), headers=headers)
print r.json()

2) 在 livy (https://github.com/apache/incubator-livy/blob/412ccc8fcf96854fedbe76af8e5a6fec2c542d25/repl/src/test/scala/org/apache/livy/repl/PythonInterpreterSpec.scala#L105) 中使用 %table 魔法

session_url = host + "/sessions/21"
statements_url = session_url + '/statements'
data = {
        'code': textwrap.dedent("""\
        val x = List((1, "a", 0.12), (3, "b", 0.63))
        %table x
        """)}
r = requests.post(statements_url, data=json.dumps(data), headers=headers)
print r.json()

【讨论】:

    【解决方案2】:

    如果您使用的是Livy 0.7.0 或更高版本,则实际上不需要魔术字符串。

    1. 创建会话:
    curl --location --request POST 'http://<host>:<port>/sessions' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "kind": "sql",
        "proxyUser": "cooL_user"
    }'
    
    1. 运行查询:
    curl --location --request POST 'http://<host>:<port>/sessions/<sessionid>/statements' \
    --header 'Content-Type: application/json' \
    --data-raw '{
        "code": "select 1"
    }'
    
    1. 定期轮询结果:
    curl --location --request GET http://<host>:<port>/sessions/<sessionid>/statements/0 | jq '.output.data.application/json.data' 
    

    就是这样。现在,您可以将此方法与 Bash 之外的任何语言一起使用。已经有一个名为 PyLivy 的 Python 库,它在底层大致遵循了这种方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 2018-09-09
      • 1970-01-01
      • 2018-02-03
      • 1970-01-01
      相关资源
      最近更新 更多