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