【问题标题】:SQL and apache drillSQL 和 apache 演练
【发布时间】:2017-12-15 01:43:44
【问题描述】:

这里是使用 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}')

【问题讨论】:

  • 你的“原始”数据库是什么,哪个数据库在 Apache Drill 下运行?
  • 原数据库为twitter.mention,Apache Drill下的新数据库为twitter.tweet。这是一个项目,我们的教授指示我们使用推文表。
  • 另外,感谢您的快速回复!
  • “数据库”是指 MySQL、SQL Server、Oracle、Postgres、DB2 等。您在这两个地方都使用哪一个?
  • 错误信息似乎是说Drill不喜欢查询中的分号。因为无论如何它可能会被忽略,你可以尝试在LIMIT 子句之后删除那个分号然后再次运行吗?

标签: python sql apache apache-drill pydrill


【解决方案1】:

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

现在,如果你想访问特定表中的数据,你首先需要告诉 Drill 存储插件。否则,Drill 应该如何知道该表驻留在哪个连接中?

例如,对于一个名为 mysql 的 MySQL 连接、一个数据库“mydb”、一个表“twitterfeed”和一个列“message”,SELECT 将如下所示:

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

这可以很容易地在提供了一个非常简单的Query 对话框的 Drill Web UI 中进行测试。

其他数据源也可以通过这种方式进行连接,例如在 MongoDB 中使用表:

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

我确实使用SELECT * 仅用于示例目的。显然,这应该始终包含正确的列名,并且没有星号。如果你只使用一个数据库,你也可以使用USE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 2012-04-28
    • 1970-01-01
    • 2017-03-28
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多