以前用sql操作DataFrame时,大都在代码上注释。注释太多会乱,并且时间久了后就算看注释,也没多大“兴趣”。这里记录每一次新遇见的需求,以及代码。
Spark-shell中使用
2018/4/12
- export SPARK_MAJOR_VERSION=2【ambari中装有两个版本的spark】
- import org.apache.spark.sql.SparkSession
- val spark = SparkSession.builder().master(“local”).appName(“dataConvert”).getOrCreate()
- import spark.implicits._【导入隐式转换】
Sql使用记录
2018/4/12
某字段分组并排序
/**
等价sql:
select table_id , count(*) AS count_tableId from table
group by table_id
order by count_tableId desc
*/
val groupByAndSort = rawDf.groupBy("table_id").count().withColumnRenamed("count", "count_tableId").sort($"count_tableId".desc)
两表关联查询,找出重复id
val rawDf1 = spark.read.format("csv").option("header", true).load("file:XXXX.csv")
val rawDf2 = spark.read.format("csv").option("header", true).load("file:XXXX.csv")
rawDf1.createOrReplaceTempView("info1")
rawDf2.createOrReplaceTempView("info2")
- 1.
rawDf1.join(rawDf2,"table_id").show
- 2.
spark.sql("SELECT info1.table_id FROM info1,info2 where info1.table_id=info2.table_id").distinct().show
两表关联查询,找出A中id在B中也有的那些数据
intersect方法可以计算出两个DataFrame中相同的记录【但是不满足我的需求】
val union = rawDf1.join(rawDf2,"vid")
join的列只会出现一次
结果保存
DataFrameName.coalesce(1)
.write
.mode(“overwrite”)
.option(“header”, true)
.format(“csv”)
.save(resultPath)
2018/4/13
计算出某列均值,并且取出
for (i <- 1 until columnNames.length) { var fill: Double = trainDf.agg(columnNames(i) -> "avg").first().getDouble(0) trainDf = trainDf.withColumn(columnNames(i), col(columnNames(i)).cast(DoubleType)).na.fill(fill) }
报错记录
1.java.io.FileNotFoundException: /tmp/xxxxxxx (Too many open files)
vi /etc/security/limits.conf
末尾添加
【最初其实我修改过这两个值:最大读取文件数和最大线程数;但是用户不是*,是elasticsearch】
* - nofile 65536
* - nproc 2048
2018/4/14
2.**java.lang.StackOverflowError **
堆栈溢出错误
未解决,莫名其妙的自动好了
3.org.codehaus.janino.JaninoRuntimeException: Code of method “processNext()V” of class “org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator” grows beyond 64 KB
未解决
报错但程序正确运行结束。满脸问号。。。
文章的不妥之处,欢迎各位前辈斧正!