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;