当使用边界查询时,有效的MySQL查询中断。

问题描述 投票:0回答:1

: 这不是一个重复的 Sqoop - 语法错误 - 边界查询 - "你的SQL语法错误"


为了限制只取最近8天的数据,我使用了下面的方法。boundary-querySqoop

SELECT min(`created_at`),
       max(`created_at`)
FROM `billing_db`.`billing_ledger`
WHERE `created_at` >= timestamp(date(convert_tz(now(), IF(@@global.time_zone = 'SYSTEM', @@system_time_zone, @@global.time_zone),'Asia/Kolkata')) + interval -2 DAY)"

为了便于阅读,我在这里把查询分成了多行,其实我只用单行传递给Sqoop。

边界查询的不同部分的解释为

  1. IF(@@global.time_zone = 'SYSTEM', @@system_time_zone, @@global.time_zone)
    • 确定服务器时区
    • 同时适用于MySQL & TiDB
  2. convert_tz(now(), <server-timezone>,'Asia/Kolkata')
    • 将服务器时区的时间转换为IST。
  3. timestamp(date(<ist-timestamp> + interval -{num_days} DAY)
    • 返回今天之前{num_days}日期的00:00时的IST时间戳(当前时间-> tz特定)

虽然查询在MySQL上运行良好

mysql> SELECT min(`created_at`),
    ->        max(`created_at`)
    -> FROM `billing_db`.`billing_ledger`
    -> WHERE `created_at` >= timestamp(date(convert_tz(now(), IF(@@global.time_zone = 'SYSTEM', @@system_time_zone, @@global.time_zone),'Asia/Kolkata')) + interval -2 DAY);
+---------------------+---------------------+
| min(`created_at`)   | max(`created_at`)   |
+---------------------+---------------------+
| 2020-05-08 00:00:00 | 2020-05-10 20:12:32 |
+---------------------+---------------------+
1 row in set (0.02 sec)

在Sqoop上的以下堆栈跟踪中,它被打破了。

INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT min(), max() FROM . WHERE  >= timestamp(date(convert_tz(now(), IF(@@global.time_zone = 'SYSTEM', @@system_time_zone, @@global.time_zone),'Asia/Kolkata')) + interval -2 DAY)
[2020-05-10 12:45:34,968] {ssh_utils.py:130} WARNING - 20/05/10 18:15:34 INFO mapreduce.JobSubmitter: Cleaning up the staging area /tmp/hadoop-yarn/staging/hadoop/.staging/job_1589114450995_0001
[2020-05-10 12:45:34,971] {ssh_utils.py:130} WARNING - 20/05/10 18:15:34 DEBUG util.ClassLoaderStack: Restoring classloader: sun.misc.Launcher$AppClassLoader@6ab7a896
[2020-05-10 12:45:34,973] {ssh_utils.py:130} WARNING - 20/05/10 18:15:34 ERROR tool.ImportTool: Import failed: java.io.IOException: java.sql.SQLSyntaxErrorException: (conn=313686) You have an error in your SQL syntax; check the manual that corresponds to your TiDB version for the right syntax to use line 1 column 12 near "), max() FROM . WHERE  >= timestamp(date(convert_tz(now(), IF(@@global.time_zone = 'SYSTEM', @@system_time_zone, @@global.time_zone),'Asia/Kolkata')) + interval -2 DAY)" 
    at org.apache.sqoop.mapreduce.db.DataDrivenDBInputFormat.getSplits(DataDrivenDBInputFormat.java:207)
    at org.apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.java:303)

郑重声明

  • 使用 WHERE $CONDITIONS 需要 --query (自由形式的查询-导入),但对于 --boundary-query 它不是强制性的。如果没有它,Sqoop只会生成以下警告信息

    WARN db.DataDrivenDBInputFormat: Could not find $CONDITIONS token in query: SELECT min(), max() FROM . WHERE >= timestamp(date(convert_tz(now(), IF(@@global.time_zone = 'SYSTEM', @@system_time_zone, @@global.time_zone),'Asia/Kolkata')) + interval -2 DAY); splits may not partition data.

  • 我一直在使用类似的复杂 boundary-query但在这个特殊情况下,它打破了我的管道中的其他地方。


我试过什么?

  • 我试着添加 别名SELECT 查询的子句是这样的

    SELECT min(`created_at`) AS min_created_at,...

sqoop
1个回答
0
投票

背标 `` 是罪魁祸首

移除边界查询中的回标,解决了错误。

  • 一些 意见 在讨论中指出,后招会引起一些奇怪的事情,与此同时。sqoop
  • 但是 文件 隐而不发 讨论 甚至鼓励使用
© www.soinside.com 2019 - 2024. All rights reserved.