Presto 踩坑笔记

查 MySQL 不走索引

查一个大表,只需要计算当天的数据,建立的联合索引里面有 createdtime 这个字段。但是查的时候,只限定 createdtime 这个字段,但是极慢没有走索引。

先 Presto 查询单个订单,秒出,即索引是有效的。然后怀疑是 Presto 日期函数处理结果的问题,发现果然不对劲。我们在 SQL 利用to_unixtime() 函数生成的结果是 timestamp类型的,MySQL表中 createdtime 的类型是 bigint,而 Presto 要求类型严格,所以踩坑了。。。

解决办法很简单,使用 cast 做一下类型转化即可

找不到表名

订单表命名为 order,在 Hive 和 MySQL 中都是使用’`’去做转义,Presto死活找不到,后来发现是使用’”‘去搞的。。。

存成文件查询报错

cli 中可以无错执行,presto -f 则报错。

若存成文件执行,要在末尾加;

重定向内容每一段包含’”‘

例如查询出来的结果像这样:"123","123","123"

处理的时候很不方便,可以直接使用 sed 命令修改文件:

1
2
3
# sed 's/要被取代的字串/新的字串/g'
sed -i 's/","/\t/g' demo.txt
sed -i 's/"//g' demo.txt

数据量太大

  1. 不要选取全部字段,选自己使用的
  2. 减少数据量常规方法…
  3. join 的时候大表放在左边,Presto 默认 broadcast join,即将 join 左边的表分割到多个 worker,然后将 join 右边的表数据整个复制一份发送到每个 worker 进行计算。如果右边的表数据量太大,则可能会报内存溢出错误。

未完待续