9

我正在使用 HTTP POST 调用在 Livy Server 中执行一条语句,localhost:8998/sessions/0/statements正文如下

{
  "code": "spark.sql(\"select * from test_table limit 10\")"
}

我想要以下格式的答案

(...)
"data": {
  "application/json": "[
    {"id": "123", "init_date": 1481649345, ...},
    {"id": "133", "init_date": 1481649333, ...},
    {"id": "155", "init_date": 1481642153, ...},
  ]"
}
(...)

但我得到的是

(...)
"data": {
  "text/plain": "res0: org.apache.spark.sql.DataFrame = [id: string, init_date: timestamp ... 64 more fields]"
}
(...)

这是数据框的toString()版本。

有没有办法使用 Livy 服务器将数据帧作为 JSON 返回?

编辑

发现了一个解决问题的 JIRA 问题:https ://issues.cloudera.org/browse/LIVY-72

通过评论可以说 Livy 不支持也不会支持这样的功能?

4

3 回答 3

4

我建议使用内置的(尽管很难找到相关文档)魔法%json%table

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

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

相关:Apache Livy:通过 REST 查询 Spark SQL:可能吗?

于 2017-10-11T18:49:20.847 回答
3

我对 Livy 没有太多经验,但据我所知,此端点用作交互式 shell,输出将是一个字符串,其中包含 shell 显示的实际结果。所以,考虑到这一点,我可以想办法模拟你想要的结果,但这可能不是最好的方法:

{
  "code": "println(spark.sql(\"select * from test_table limit 10\").toJSON.collect.mkString(\"[\", \",\", \"]\"))"
}

然后,您将有一个 JSON 包装在一个字符串中,以便您的客户端可以解析它。

于 2016-12-14T08:27:31.867 回答
0

我认为通常你最好的选择是将你的输出写入某种数据库。如果您写入一个随机命名的表,您可以在脚本完成后让您的代码读取它。

于 2017-03-15T22:09:37.723 回答