子查询报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")