一、Spark创建
1.创建SparkSession
/**
* local[*]表示使用本机的所有处理器创建工作节点
* spark.driver.memory spark的驱动器内存
* Spark2.2好像是需要最小2G
*/
SparkSession session = SparkSession.
builder
() .appName(
"sparkAnalysis"
).master(
"local[*]"
).config(
"spark.driver.memory"
,
"2147480000"
).getOrCreate()
;
2.创建可以连接hive的SparkSession(由于一般使用SparkSubmit进行提交任务,在sparkSubmit时候设置master,故可以不用配置master)
SparkSession
sparkSession =
SparkSession
.
builder
()
.appName(
"hive"
)
.config(
"spark.driver.memory"
,
"2147480000"
)
.enableHiveSupport()
.getOrCreate()
;
3.SparkSubmit 的 shell脚本
/data/spark/spark-2.2.0-bin-hadoop2.7/bin/spark-submit --master spark://elcndc2sc39t:7077 --class com.enc.analysis.core.AlgorithmExecute /data/upload/analysis/analysisFrame-1.1.0.jar $1 $2
--master表示master路径,--class表示入口的类的全路径 /data/upload/analysis/analysisFrame-1.1.0.jar 表示计算框架jar包的全路径 $!,$2..是自定义的shell命令进行传参,传递的参数会在入口类的main方法的String[] args中
二、利用Spark读取jdbc
Properties
connectionProperties =
new
Properties
()
;
String url =
"jdbc:mysql://"
+
"mysql服务器地址"
+
":"
+
"mysql端口"
+
"/"
+
"数据库名?useUnicode=true&characterEncoding=utf-8"
;
String driver =
"com.mysql.jdbc.Driver"
;
connectionProperties.setProperty(
"user"
,
"用户名"
)
;
// 设置用户名
connectionProperties.setProperty(
"password"
,
"密码"
)
;
// 设置密码
connectionProperties.setProperty(
"driver"
,
driver)
;
connectionProperties.setProperty(
"url"
,
url)
;
SparkSession spark = SparkSessionUtils.
getLocalSession
()
;
Dataset dataset = spark.read().jdbc(connectionProperties.getProperty(
"url"
)
,
"表名"
,
connectionProperties).persist()
;
dataset.show()
;
三、Spark 的 map操作
/**
* 将Dataset
转化为List
形式
*/
Dataset dataset = spark.read().jdbc(connectionProperties.getProperty(
"url"
)
,
"cq_jqxx"
,
connectionProperties).persist()
;
Dataset
new
MapFunction
,
Map>() {
@Override
public
Map
call
(Row row)
throws
Exception {
HashMap hashMap =
new
HashMap()
;
//这是一个遍历操作,row即表示为当前行数据,get(i)表示当前行的第几列
hashMap.put(row.get(
0
)
,
row.get(
1
))
;
return
hashMap
;
}
//转换为基本类型时用Encoders>STRING()等对应的基本类型
// 当使用Encoders.javaSerialization()时当前类需要实现序列化
}
,
Encoders.
javaSerialization
(Map.
class
))
;
List
;
四、Dataset相关类型的互相转换
1.java中List转为数组结构(由于经常使用到)
List
list =
new
ArrayList<>()
;
String[] strings = list.toArray(
new
String[list.size()])
;
2.Dataset转为JavaRDD
JavaRDD
rowJavaRDD = dataset.javaRDD()
;
3.JavaRDD转为Dataset
Dataset
dataFrame = sparkSession.createDataFrame(rowJavaRDD
,
Row.
class
)
;
4.利用内部类实现Row转为自己需要的Row,例如将某行进行分词变为String[]
Dataset
select = dataset.select(
"label"
,
"message"
)
;
JavaRDD map = select.javaRDD().map(WordParticiple::
parseWordParticiple
)
;
Dataset
wordParticiple = spark.createDataFrame(map
,
WordParticiple.
class
)
;
内部类对象
public static class
WordParticiple{
private
String
label
;
private
String[]
message
;
public
WordParticiple
(String label
,
String[] message) {
this
.
label
= label
;
this
.
message
= message
;
}
public
WordParticiple
() {
}
public
String
getLabel
() {
return
label
;
}
public void
setLabel
(String label) {
this
.
label
= label
;
}
public
String[]
getMessage
() {
return
message
;
}
public void
setMessage
(String[] message) {
this
.
message
= message
;
}
public static
WordParticiple
parseWordParticiple
(Row row)
throws
IOException {
String string = row.getString(
1
)
;
String[] split = TermTokenizer.
split
(string)
;
return new
WordParticiple(row.get(
0
).toString()
,
split)
;
}
}