spark hive sql查询中遇到的一些问题

子查询报0参数问题

join 后添加了 in 其中又是一个具有join的子查询语句 ,把条件放到where 中,或者进行join子查询
报错代码:

SELECT  * 
FROM
test_sch a
JOIN test_sch b ON a.one = b.one 
AND a.one IN ( SELECT c.one FROM test_sch c LEFT JOIN test_sch d ON c.one = d.one) 

正常代码:
首先对b表进行a表的字段过滤,在进行左连接保持逻辑正确

SELECT  * 
FROM
test_sch a
left JOIN (
	SELECT  b.* 
	FROM
	test_sch b
	JOIN (
		SELECT  * 
		FROM
		test_sch  a
		WHERE
		one IN (  SELECT c.one FROM test_sch c LEFT JOIN test_sch d ON c.one = d.one) 
		) a on b.one =a.one
) b ON a.one = b.one 

返回值超过22超过元组最大值问题

使用schma

val schema = StructType(Seq(StructField("MGT_ORG_CODE", StringType), StructField(column, StringType))
val rowEncoder = RowEncoder(schema)
rdd.map(row=>{Row.fromSeq(Seq(code,col))})(rowEncoder).toDF()//dataframe一样

值得注意的是使用了自定义的schma后自带的类型转换就失效了,向hive中存储实际上自动转成字符串存储,如果你不转换,存的时候就会报错,而且看起来hive中存着类型,实际是字符串读出时,通过另一张系统自动生成的表自动进行了类型转换,这都是原生的为我们提供的

想把dataframe进行union但是仅合并共有的保留他们自己的,缺少null填充

def concatDF(data1:DataFrame, data2:DataFrame):DataFrame={
val cols1 = data1.columns.toSet
val cols2 = data2.columns.toSet
val total = cols1 ++ cols2 // union
def expr(myCols: Set[String], allCols: Set[String]) = {
  allCols.toList.map(x => x match {
    case x if myCols.contains(x) => col(x)
    case _ => lit(null).as(x)
  })
}
data1.select(expr(cols1, total):_*).union(data2.select(expr(cols2, total):_*))
}

参考的一个博主的,但是原文忘记在哪了

数据库建,表名字段名和要使用大写,否则会导致表不存在

orcal数据库查出数据使用spark的get接收问题

数据库中为number类型的字段,在Java类型中对应的有Integer和BigDecimal都会出现;
经测试发现当数据库为sql server和DB2时,用getObject()取出来时Integer类型,但是Oracle 中取出来就会是Integer或者BigDecimal类型。原因是oracle与java类型对应于number长度有关。
在这里插入图片描述
遇到该类型问题,若要判断每个数据库和数据库字段长度不同对应的java数据类型不同太过烦琐,可采用getString()来取值,统一先转为string来判断
另外附上
java.sql.Types,数据库字段类型,java数据类型的对应关系
http://www.cnblogs.com/shishm/archive/2012/01/30/2332142.html
本处参考原文:https://blog.csdn.net/ludongshun2016/article/details/71453125

spark的保存函数

在开启下面的前提下
spark.sql(" set hive.exec.dynamic.partition=true ")
spark.sql(“SET hive.exec.dynamic.partition.mode=nonstrict”)

frame.write.mode(SaveMode.Overwrite).format("hive").partitionBy("dt").saveAsTable
或者使用hive的create table建立的表
使用Overwrite.insertInto的时候只会覆盖有的分区
如果想让frame.write.mode(SaveMode.Overwrite).partitionBy("dt").saveAsTable也可以
需要开启spark.conf.set("spark.sql.sources.partitionOverwriteMode", "dynamic")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值