spark操作总结
一、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操作总结的更多相关文章
- spark 操作hbase
HBase经过七年发展,终于在今年2月底,发布了 1.0.0 版本.这个版本提供了一些让人激动的功能,并且,在不牺牲稳定性的前提下,引入了新的API.虽然 1.0.0 兼容旧版本的 API,不过还是应 ...
- Spark操作hbase
于Spark它是一个计算框架,于Spark环境,不仅支持单个文件操作,HDFS档,同时也可以使用Spark对Hbase操作. 从企业的数据源HBase取出.这涉及阅读hbase数据,在本文中尽快为了尽 ...
- Spark操作实战
1. local模式 $SPARK_HOME/bin/spark-shell --master local import org.apache.log4j.{Level,Logger} // 导入ja ...
- Spark操作算子本质-RDD的容错
Spark操作算子本质-RDD的容错spark模式1.standalone master 资源调度 worker2.yarn resourcemanager 资源调度 nodemanager在一个集群 ...
- Spark操作MySQL,Hive并写入MySQL数据库
最近一个项目,需要操作近70亿数据进行统计分析.如果存入MySQL,很难读取如此大的数据,即使使用搜索引擎,也是非常慢.经过调研决定借助我们公司大数据平台结合Spark技术完成这么大数据量的统计分析. ...
- Spark操作dataFrame进行写入mysql,自定义sql的方式
业务场景: 现在项目中需要通过对spark对原始数据进行计算,然后将计算结果写入到mysql中,但是在写入的时候有个限制: 1.mysql中的目标表事先已经存在,并且当中存在主键,自增长的键id 2. ...
- spark操作Kudu之写 - 使用DataFrame API
在通过DataFrame API编写时,目前只支持一种模式“append”.尚未实现的“覆盖”模式 import org.apache.kudu.spark.kudu._ import org.apa ...
- spark操作Kudu之读 - 使用DataFrame API
虽然我们可以通过上面显示的KuduContext执行大量操作,但我们还可以直接从默认数据源本身调用读/写API. 要设置读取,我们需要为Kudu表指定选项,命名我们要读取的表以及为表提供服务的Kudu ...
- spark操作kudu之DML操作
Kudu支持许多DML类型的操作,其中一些操作包含在Spark on Kudu集成 包括: INSERT - 将DataFrame的行插入Kudu表.请注意,虽然API完全支持INSERT,但不鼓励在 ...
- 使用spark操作kudu
Spark与KUDU集成支持: DDL操作(创建/删除) 本地Kudu RDD Native Kudu数据源,用于DataFrame集成 从kudu读取数据 从Kudu执行插入/更新/ upsert ...
随机推荐
- 软件工程卷1 抽象与建模 (Dines Bjorner 著)
I 开篇 1. 绪论 II 离散数学 2. 数 (已看) 3. 集合 4. 笛卡尔 5. 类型 6. 函数 7. λ演算 8. 代数 9. 数理逻辑 III 简单RSL 10. RSL中的原子类型和值 ...
- vue 2.0 及 vue 3.0 rem配置
vue 2.0 配置 rem 首先先安装postcss-px2rem (百度可以) https://www.jianshu.com/p/e6476bbc2131 npm install postc ...
- Java 并发系列之二:java 并发机制的底层实现原理
1. 处理器实现原子操作 2. volatile /** 补充: 主要作用:内存可见性,是变量在多个线程中可见,修饰变量,解决一写多读的问题. 轻量级的synchronized,不会造成阻塞.性能比s ...
- java web开发入门三(Hibernate)基于intellig idea
Hibernate 1.开发流程 项目配置好后的结构: 1.下载源码: 版本:hibernate-distribution-3.6.0.Final 2.引入hibernate需要的开发包(3.6版本) ...
- 不了解这12个语法糖,别说你会Java!
阅读本文大概需要 10 分钟. 作者:Hollis 本文从 Java 编译原理角度,深入字节码及 class 文件,抽丝剥茧,了解 Java 中的语法糖原理及用法,帮助大家在学会如何使用 Java 语 ...
- 记录ssis的两个异常解决办法
1.Foreach文件枚举提示变量为空的解决办法:把foreach属性窗口中的DelayValidation设置为True就可以了 2.csv导入数据库提示:无法在 unicode 和非 unicod ...
- 《Linux就该这么学》培训笔记_ch00_认识Linux系统和红帽认证
<Linux就该这么学>培训笔记_ch00_认识Linux系统和红帽认证 文章最后会post上书本的笔记照片. 文章主要内容: 认识开源 Linux系统的种类及优势特性 认识红帽系统及红帽 ...
- spark 读取 ftp
class FtpShow(spark: SparkSession, map: Map[String, String]) { private val path = map(FtpOptions.PAT ...
- (转)解决mybatis的mapper.xml查询不出数据,结果一直为null问题
背景:记录mybatis使用过程中遇到的相关问题. 解决mybatis的mapper.xml查询不出数据,结果一直为null问题 解决方案: 1 修改实体类与数据库字段名相同 2 修改sql查询语句, ...
- PatchMatch Stereo - Stereo Matching with Slanted Support Windows
Tips MVS: Multi-View Stereo Abstract 思路:一般的局部立体方法是一个具有整形数值视察(disparity)的支持镜头进行匹配,其中有一个隐藏的假设:再支持区域的像素 ...