SQL和apache钻取

时间:2017-12-15 01:43:45

标签: python sql apache apache-drill pydrill

使用SQL和Apache Drill的新程序员。我正在尝试从DB1中获取此SQL命令:

SELECT screen_name, job_id, count(*) as counter
from twitter.mention t
WHERE t.job_id = 290
or t.job_id = 261
or t.job_id = 303
group by screen_name, job_id
order by counter desc
limit 60;

我正在尝试使用这个块并通过Apache Drill运行它,我很新。值得注意的是,我正在使用两个数据库,但只有一个变量正在改变:screen_name(更改为from_user_name)。它在SQL中运行良好,但它在钻取时不起作用。这是钻探代码:

statement = """
SELECT from_user_name, job_id, count(*) as counter
from twitter.tweet t
WHERE t.job_id = 290
or t.job_id = 261
or t.job_id = 303
group by from_user_name, job_id
order by counter desc
limit 60;"""

drill = PyDrill(host='host_name', port=8047)

if not drill.is_active():
    raise ImproperlyConfigured('Please run Drill first')


rows = drill.query(statement, timeout = 120)

df = rows.to_dataframe()
df.head(20) 

以下是错误消息:

TransportError: TransportError(500, '{\n  "errorMessage" : "PARSE 
ERROR: Encountered \\";\\" at line 9, column 9.\\nWas expecting one 
of:\\n    <EOF> \\n    \\"OFFSET\\" ...\\n    \\"FETCH\\" ...\\n    
\\n\\nSQL Query \\nSELECT from_user_name, job_id, count(*) as 
counter\\nfrom twitter.tweet t\\nWHERE t.job_id = 290\\nor t.job_id = 
261\\nor t.job_id = 303\\ngroup by from_user_name, job_id\\norder by 
counter desc\\nlimit 60;\\n        ^\\n\\n\\n[Error Id: 78df6d24-686b-
496f-8795-9b3d21d75740 on c04.h-spark.cgi.missouri.edu:31010]"\n}')

1 个答案:

答案 0 :(得分:0)

这很大程度上取决于存储插件部分中的映射。你是如何命名存储组件的?例如。如果你连接到MySQL数据库,存储插件可能被称为mysql。

现在,如果要访问特定表中的数据,首先需要告诉Drill存储插件。钻怎么应该知道这个表所在的连接?

例如,使用名为mysql的MySQL连接,数据库“mydb”,表“twitterfeed”和列“消息”,SELECT将如下所示:

SELECT * FROM mysql.mydb.twitterfeed.message LIMIT 10;

这可以在Drill Web UI中轻松测试,它提供了一个非常简单的Query对话框。

其他数据源可以以这种方式连接,例如使用MongoDB中的表:

SELECT * FROM mysql.mydb.twitterfeed.message 
JOIN mongodb.thedb.tablename ON mysql.mydb.twitterfeed.id = mongodb.thedb.tablename.externalid
LIMIT 10;

我仅使用SELECT *作为示例目的。显然,这应该始终保持正确的列名称而不是asterik。如果您只使用一个数据库,也可以使用USE