Apache·李维:通过REST查询Spark SQL:可能吗?

pkbketx9  于 2023-03-03  发布在  Apache
关注(0)|答案(2)|浏览(174)

apache Livy的文档很少:是否可以使用ApacheLivy将SparkSQL查询结果集作为REST调用返回?调用应用程序是移动的,它不能使用odbc/jdbc连接。因此Sparkthriftserver不是一个选项。

cl25kdpy

cl25kdpy1#

是的,可以通过Livy提交Spark SQL查询。但是,[目前]不支持独立提交的查询。它们需要用Python或Scala代码 Package 。
下面是两个使用Python执行Spark SQL查询的例子,通过请求lib和Scala代码作为字符串在“spark”中执行,从而与Livy进行交互:
1)在livy中使用%json魔法(网址:http://github.com/apache/孵化器-livy/blob/412 ccc 8 fcf 96854 fedbe 76 af 8 e5 a6 fec 2c 542 d25/repl/src/test/scala/org/apache/livy/repl/Python解释器规范。

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中使用%表格魔术(http://github.com/apache/孵化器-livy/blob/412 ccc 8 fcf 96854 fedbe 76 af 8 e5 a6 fec 2c 542 d25/repl/src/测试/scala/org/apache/livy/repl/Python解释器规范。

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()
lsmepo6l

lsmepo6l2#

如果使用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'

就是这样,现在你可以在任何语言中使用这种方法,已经有一个Python库PyLivy,它基本上遵循了这种方法。

相关问题