用hive语句走过的坑

1.在sqlServer中有isnull 函数,但是hive不支持,只能用case when 字段 is null then 0 else 字段 end as 字段

2.hive

 join 表时 join 的表不能是带括号的,如果必须jion这种条件生成的表,需要根据条件生成临时表

错误写法:

spark.sql(""""select a.*,b.* from a join (select XXX,XX from c where )b where a.XX=b.XX""").

createOrReplaceTempView("test")

正确写法:

spark.sql("select XXX,xx from c where").createOrReplaceTempView("cc")

spark.sql("select a.*,cc.* from a join cc where a.XX=cc.XX")

createOrReplaceTempView("testStr")

3.hive 不支持delete from 的操作,需要转化

4.hive支持in 和 not in ,并且支持子查询

 

spark.sql(
  """select MEMBER from bigdata.siebel_id where dt=20180101 and MEMBER
    |not in (select MEMBER from siebel_id where dt=20170822)
  """.stripMargin).show(false)

5.datediff()函数

sqlServer 中,语法:datediff(department,startdate,enddate) ,有三个参数,department 可以是year,month,day ...

hive 中语法: datediff(stardate,enddate),有两个参数 ,返回结束日期减去开始日期的天数,返回值是int

 

6在用spark.sql()写语句时,大小写敏感,数据库中的表名如果是大写,语句就要写大写,不然会报错。条件中字段如果有字符串,字符串的大小写也需要注意,比如原表中的status_cd='Active',如果语句中写status_cd='ACTIVE'就会导致查询不到数据

 

7.上周让同步一张mysql表的数据到hadoop,语句在navicat上运行没一点儿问题,代码写到java里面,日志一直报语法错误

,死活找不到原因。最后竟然是只能写一个sql语句。不能用"use 数据库名;select * from xxxx"

正确的写法是"select * from 数据库名.xxx" 。mysql的版本是5.7.15 

 

8.同样是mysql数据同步到hadoop上,以前同事说,mysql是什么类型就同步到hive是什么类型。以前建表的时候把所有的字段都设置成string类型的。这次准备按照同事的建议,datetime类型在hive 上改为date(改datetime的时候,语法显示只支持date和timestamp)类型,建表完成,分区加好,集群上date类型的读都为null值 。然后就重新建表,改为string类型,就好了  

9.spark.sql 

spark.sql(insert into bigdata.xxx partition(dt='20180101') select x,zz,aa,ee from tempView)

10.spark

Exception in thread "main" org.apache.spark.sql.AnalysisException: Resolved attribute(s) ORDER_ID#1111,MEMBER_ID#1110 missing from SRV_PROV_OU_ID#365,LOY_MEMBER_ID#360,ORDER_DT#362,ORDER_ID#344,MEMBER_ID#343,NUM#345 in operator !Project [MEMBER_ID#1110, ORDER_ID#1111, ORDER_DT#362, SRV_PROV_OU_ID#365, LOY_MEMBER_ID#360, NUM#345, NUM#345]. Attribute(s) with thesame name appear in the operation: ORDER_ID,MEMBER_ID. Please check if the right attribute(s) are used.;;
Project [member_id#1110, srv_prov_ou_id#365, MAX_FREQ#1106L]

将join 的两个表的字段重新起别名

11.spark.sql 中使用相关子查询报错

org.apache.spark.sql.AnalysisException: Correlated scalar subqueries must be aggregated:必须聚合相关的表量子查询

解决方法:
 使用inner join 取代 where in 语句

 spark.sql("""select x,xxx from xx a1 where x in (select x from mem_have_max) and a1.freq=(    select max from xxxx a2 where a2.max=a1.xxx)""").createOrReplaceTempView("zzzz")  报错

修改

spark.sql("""select x,xxx from aa inner join mem_have_max  a1 inner join xxxx a2 where aa.x=a1.x and aa.x=a2.x and aa.xxx=a2.xxx""").createOrReplaceTempView("max_store")

 

.12.spark.sql()

spark.sql("select * from xxx limit 100").persist(StorageLevel.MEMORY_AND_DISK).createOrReplaceTempView("xxx")

 

13.

Exception in thread "task-result-getter-5" java.lang.OutOfMemoryError: GC overhead limit exceeded

网上有说是driver-memory的内存设置的太小

就将driver-memory从2G设置到10G,测试一下

java heap space 

 

spark 的性能,想要它快,就得充分利用好系统资源,尤其是内存和CPU:核心思想就是能用内存 cache 就别 spill 落磁盘,CPU 能并行就别串行,数据能 local 就别 shuffle

 

14.hive 求取某时间为星期几的函数

last_upd为String类型的时间值 例:2019-01-29 14:23:57

select distinct IF(pmod(datediff(last_upd, '1920-01-01 00:00:00') - 3, 7)='0', 7, pmod(datediff(last_upd, '1920-01-01 00:00:00') - 3, 7)) from xxxx where dt=20190130 or dt=20190129 or dt=20190128;  

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(用hive语句走过的坑)