Livy 服务器:return 数据框为 JSON?
Livy Server: return a dataframe as JSON?
我正在 Livy Server 中执行一个语句,使用 HTTP POST 调用 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 服务器 return 数据帧 JSON?
编辑
找到解决问题的 JIRA 问题:https://issues.cloudera.org/browse/LIVY-72
根据评论可以说 Livy 不支持也不会支持这样的功能吗?
我对 Livy 没有太多经验,但据我所知,此端点用作交互式 shell 并且输出将是一个字符串,其中包含将显示的实际结果通过 shell。因此,考虑到这一点,我可以想出一种方法来模拟您想要的结果,但这可能不是最好的方法:
{
"code": "println(spark.sql(\"select * from test_table limit 10\").toJSON.collect.mkString(\"[\", \",\", \"]\"))"
}
然后,您将有一个 JSON 包裹在一个字符串中,以便您的客户端可以解析它。
我认为通常最好的办法是将输出写入某种数据库。如果您写入一个随机命名的 table,您可以在脚本完成后让您的代码读取它。
我建议使用内置的(虽然很难找到文档)魔术 %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: query Spark SQL via REST: possible?
我正在 Livy Server 中执行一个语句,使用 HTTP POST 调用 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 服务器 return 数据帧 JSON?
编辑
找到解决问题的 JIRA 问题:https://issues.cloudera.org/browse/LIVY-72
根据评论可以说 Livy 不支持也不会支持这样的功能吗?
我对 Livy 没有太多经验,但据我所知,此端点用作交互式 shell 并且输出将是一个字符串,其中包含将显示的实际结果通过 shell。因此,考虑到这一点,我可以想出一种方法来模拟您想要的结果,但这可能不是最好的方法:
{
"code": "println(spark.sql(\"select * from test_table limit 10\").toJSON.collect.mkString(\"[\", \",\", \"]\"))"
}
然后,您将有一个 JSON 包裹在一个字符串中,以便您的客户端可以解析它。
我认为通常最好的办法是将输出写入某种数据库。如果您写入一个随机命名的 table,您可以在脚本完成后让您的代码读取它。
我建议使用内置的(虽然很难找到文档)魔术 %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: query Spark SQL via REST: possible?