Spark sql 使用中的bug

本文详细介绍了Spark读取外部配置的方法,包括使用`–files`选项加载多个文件,以及scala和java中不同方式读取properties文件。此外,还涵盖了Spark中RDD转DF的限制、类型控制、自定义排序和配置参数传递的规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spark读取外部配置的方式,
1、–files C O N F D I R / l o g 4 j . x m l , {CONF_DIR}/log4j.xml, CONFDIR/log4j.xml,{CONF_DIR}/default.properties,${BASE_DIR}/hbase.properties
上传多个文件,用英文逗号分隔开,文件路径必须是全路径

程序中读取的方式:
1.1、scala.io.Source.fromFile("hbase.properties").getLines().foreach(println(_))
	注意这里使用文件名称读取即可,使用全路径读取报找不到此文件
	需要的数据要自己写代码处理

1.2、val props = new Properties(); props.load(new FileInputStream("hbase.properties"))
	使用java中Properties类读取文件,注意此处也是使用文件名,非全路径
	会自动加载key=value的形式到props中

二、
spark程序中不导入import spark.implicits._隐式转换类,无法将rdd的数据集转换为DF

三、
使用typeLit对新增数据列的类型控制,如typedLitString,如果只是withColumn(“time_type”,lit(“0”)) 会自动 转换为Integer类型

四、自定义排序:// 自定义排序,sorted排序继承Ordered,需要序列化
class MySort(val id:Int,val age:Int) extends Ordered[MySort] with Serializable{
override def compare(that: MySort):Int = {
if(that.id == id){// 如果id相等,就比较年龄
age - that.age
}else{
id - that.id
}
}
}

case class Person(id:Int,age:Int,name:String)={def this()=this(null,null,null)}
val tmp=sc.parallelize(Seq(Person(1,21,“java”),Person(4,30,“c++”),Person(3,22,“python”),Person(4,22,“h5”)))
val rs=tmp.map(x=>{(new MySort(x.id,x.age),x)})
rs.sortByKey().map(_._2).collect

四、spark-submit提交程序时,使用–conf传自定义的参数时,必须使用spark.开头,程序中使用sparkConf.get(key)才能获取到,否则获取不到,spark中内部规则

五、使用withColumn、withColumnRename时,
1、迭代添加列时,需要考虑性能问题,尽量使用select转换进行代替
2、df.alias(“a”).withColumn时,使用select($“a.*”),被withColumn的列不属于别名a表的列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值