一、sparkContext与sparkSession区别

任何Spark程序都是SparkContext开始的,SparkContext的初始化需要一个SparkConf对象,SparkConf包含了Spark集群配置的各种参数,sparkContext只能在driver机器上面启动;
SparkSession: SparkSession实质上是SQLContext和HiveContext的组合,SparkSession内部封装了sparkContext,所以计算实际上是由sparkContext完成

val conf: SparkConf = new SparkConf().setAppName("test")
val spark: SparkSession = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate()

二、repartition与coalesce区别

repartition一般是用来增加分区数(当然也可以减少),coalesce只能用来减少分区数。所以如果不介意保存的文件块大小不一样,可以使用coalesce来减少分区数,保存的时候一个分区就会生成一个文件块

三、Scala常用方法

1. StringBuilder

主要用于字符串的拼接,可作用于生成倒排序列,如:
val userItemScore = sc.parallelize(List((, , 0.8), (, , 0.7), (, , 0.5), (, , 0.9)))
userItemScore.map(x => (x._1, (x._2.toString, x._3.toString))).groupByKey()
.map{x =>
val userid = x._1
val item_score_list = x._2
val tmp_arr = item_score_list.toArray.sortWith(_._2 > _._2)
val watch_len = tmp_arr.length
val strbuf = new StringBuilder() for (i <- until watch_len - ) {
strbuf ++= tmp_arr(i)._1
strbuf.append(":")
strbuf ++= tmp_arr(i)._2
strbuf.append(" ")
}
strbuf ++= tmp_arr(watch_len - )._1
strbuf.append(":")
strbuf ++= tmp_arr(watch_len - )._2 userid + "\t" + strbuf
}.collect()

2. scala.collection.mutable.ArrayBuffer

相当于是一个大小可变数组,把需要的值添加进来,例如:
val tmpArray = new ArrayBuffer[String]()
val tmpArray = new ArrayBuffer[Int]()
val tmpArray = new ArrayBuffer[(String, Int)]()
scala> tmpArray.append(("wangzai", ))
scala> tmpArray
res11: scala.collection.mutable.ArrayBuffer[(String, Int)] = ArrayBuffer((wangzai,), (test,)) tmpArray.indexOf(("test",))为获取当前值的索引,返回类型为整型
tmpArray.slice(tmpArray.indexOf(("test", )), tmpArray.length)为切片,返回类型为ArrayBuffer

四、通过spark-shell来操作数据库中的表

1 启动(通过--jars指定包,后面reids包不需要,只是演示添加多个包的用法)

/xxx/spark/bin/spark-shell \
--master spark://xxx:7077 \
--executor-cores \
--total-executor-cores \
--driver-memory 2g \
--jars /xxx/jars/mysql-connector-java-5.1..jar,/xxx/jars/jedis-2.9..jar

2 在命令行中输入::paste, 然后粘贴以下代码,最后ctrl+D退出之后,即可执行


import java.util.Properties
import org.apache.spark.sql.{DataFrame, SparkSession}
import org.apache.spark.SparkConf
val conf: SparkConf = new SparkConf()
val spark: SparkSession = SparkSession.builder().config(conf).getOrCreate()
val mysqlUrl: String = "jdbc:mysql://ip:port/database?useUnicode=true&characterEncoding=UTF-8&useSSL=false"
val productTable: String = "product_info"
val orderTable: String = "order_info"
val properties: Properties = new Properties()
properties.put("user", user)
properties.put("password", password)


// 获取同事购配置表数据
val productDF: DataFrame = spark.read.jdbc(mysqlUrl, productTable, properties).select("id", "name")
val orderDF: DataFrame = spark.read.jdbc(mysqlUrl, orderTable, properties).select("product_id", "createTime")


val totalDataDF = productDF.join(orderDF, orderDF("product_id") === productDF("id")).drop("id")
//如果product_info对应的id为product_id,即关联id字段名不相同
//val totalDataDF = productDF.join(orderDF, Seq("product_id"))

3 把该DateFrame注册为临时表才能通过spark-sql操作

totalDataDF.createOrReplaceTempView("totalDataDF")

五、spark-sql的基本操作

//默认显示20条数据
scala> df.show()
//打印模式信息
scala> df.printSchema()
//选择多列
scala> df.select(df("name"),df("age")+).show()
// 条件过滤
scala> df.filter(df("age") > ).show()
// 分组聚合
scala> df.groupBy("age").count().show()
// 排序
scala> df.sort(df("age").desc).show()
//多列排序
scala> df.sort(df("age").desc, df("name").asc).show()
//对列进行重命名
scala> df.select(df("name").as("username"),df("age")).show()
//对多个列重命名
scala> df.withColumnRenamed("id", "userId").withColumnRenamed("name", "userName")

spark操作总结的更多相关文章

  1. spark 操作hbase

    HBase经过七年发展,终于在今年2月底,发布了 1.0.0 版本.这个版本提供了一些让人激动的功能,并且,在不牺牲稳定性的前提下,引入了新的API.虽然 1.0.0 兼容旧版本的 API,不过还是应 ...

  2. Spark操作hbase

    于Spark它是一个计算框架,于Spark环境,不仅支持单个文件操作,HDFS档,同时也可以使用Spark对Hbase操作. 从企业的数据源HBase取出.这涉及阅读hbase数据,在本文中尽快为了尽 ...

  3. Spark操作实战

    1. local模式 $SPARK_HOME/bin/spark-shell --master local import org.apache.log4j.{Level,Logger} // 导入ja ...

  4. Spark操作算子本质-RDD的容错

    Spark操作算子本质-RDD的容错spark模式1.standalone master 资源调度 worker2.yarn resourcemanager 资源调度 nodemanager在一个集群 ...

  5. Spark操作MySQL,Hive并写入MySQL数据库

    最近一个项目,需要操作近70亿数据进行统计分析.如果存入MySQL,很难读取如此大的数据,即使使用搜索引擎,也是非常慢.经过调研决定借助我们公司大数据平台结合Spark技术完成这么大数据量的统计分析. ...

  6. Spark操作dataFrame进行写入mysql,自定义sql的方式

    业务场景: 现在项目中需要通过对spark对原始数据进行计算,然后将计算结果写入到mysql中,但是在写入的时候有个限制: 1.mysql中的目标表事先已经存在,并且当中存在主键,自增长的键id 2. ...

  7. spark操作Kudu之写 - 使用DataFrame API

    在通过DataFrame API编写时,目前只支持一种模式“append”.尚未实现的“覆盖”模式 import org.apache.kudu.spark.kudu._ import org.apa ...

  8. spark操作Kudu之读 - 使用DataFrame API

    虽然我们可以通过上面显示的KuduContext执行大量操作,但我们还可以直接从默认数据源本身调用读/写API. 要设置读取,我们需要为Kudu表指定选项,命名我们要读取的表以及为表提供服务的Kudu ...

  9. spark操作kudu之DML操作

    Kudu支持许多DML类型的操作,其中一些操作包含在Spark on Kudu集成 包括: INSERT - 将DataFrame的行插入Kudu表.请注意,虽然API完全支持INSERT,但不鼓励在 ...

  10. 使用spark操作kudu

    Spark与KUDU集成支持: DDL操作(创建/删除) 本地Kudu RDD Native Kudu数据源,用于DataFrame集成 从kudu读取数据 从Kudu执行插入/更新/ upsert ...

随机推荐

  1. Problem C. 欧皇 ————2019.10.12

    题目: 再次感激土蛋 #include <bits/stdc++.h> using namespace std; typedef long long ll; ; ll C[][]; voi ...

  2. table开发中遇到的问题

    table元素是一个很常用的元素.但是在开发中,我也遇到了一些值得记录下来的问题及解决方案: 1.td内容溢出时,隐藏内容并且以省略号提示 .hide-content{ /* 不换行 */ white ...

  3. 【CF10D】 LCIS

    题目链接 最长公共上升子序列 \(f[i][j]\)表示\(A\)的前\(i\)个数,匹配\(B\)的第\(j\)个数,且\(B[j]\)必选时的最长公共上升子序列长度 转移: if(A[i]==B[ ...

  4. 几句话总结一个算法之CTR预估模型

    背景 假设现在有个商品点击预测的任务,有用户端特征性别.年龄.消费力等,商品侧特征价格.销量等,样本为0或者1,现在对特征进行one hot encode,如性别特征用二维表示,男为[1,0],女为[ ...

  5. 不让应用的日志输出到message文件中

    有时我们制定一个应用的日志输出到一个文件的时候例如: (百度了好久都百度不好,这里记录一下时间2015年12月7日16:28:39) local7.*                          ...

  6. c# 数据请求方式提供

    营销平台数据请求介绍 项目介绍: 前端使用 WPF,采用MVVM模式  后端数据库采用的sqlite 依靠本地化运行   后期可能会采用WebApi   因为WPF都是自学的 所以 代码方面写的可能不 ...

  7. 使用springboot mybatis 查询时实体类中的驼峰字段值为null

    看到返回结果以后主要分析了一下情况: 实体类的get.set方法确实 mapper.xml文件中的resultMap.resultType等原因导致 数据库中数据存在问题 经过检查与验证发现以上都不存 ...

  8. C基础 带你手写 redis adlist 双向链表

    引言 - 导航栏目 有些朋友可能对 redis 充满着数不尽的求知欲, 也许是 redis 属于工作, 交流(面试)的大头戏, 不得不 ... 而自己当下对于 redis 只是停留在会用层面, 细节层 ...

  9. 定时删除10天前的Es索引

    说明 主要用在索引名为 xxxx-yyyy.MM.dd 这种,可以自定义修改下边的脚本 删除索引shell 创建 delete_es_indices_over_10_day.sh #!/bin/bas ...

  10. c# winform结合数据库动态生成treeview的父节点和子节点方法和思路

    tb_food表的结构如图一: tb_foodtype表的结构如图二: //获取tb_foodtype表中的所有数据 private void InitDataTable() { SqlConnect ...