版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013066244/article/details/80744832
环境
spark:2.3.1
java:1.8
Hadoop:2.7.6
前言
个人笔记
正文
SparkSession
这个是java
代码的入口点。一切的一切都是从这里开始的。
DataFrames
相当于关系型数据库中的表的概念 在spark
中是Rows
。
Temporary views 临时视图
创建方法:
SparkSession spark = SparkSession.builder().appName("Simple Application").getOrCreate();
Dataset<Row> df = spark.read().json("D:\\Program Files\\spark-2.3.1-bin-hadoop2.7\\examples\\src\\main\\resources\\people.json");
df.createOrReplaceTempView("people");
该临时视图不能被其他会话所使用。
Global Temporary View 全局临时视图
如果您想要在所有会话之间共享一个临时视图并保持活动状态,直到Spark应用程序终止,则需要创建全局临时视图:Global Temporary View
// Register the DataFrame as a global temporary view
df.createGlobalTempView("people");
// Global temporary view is tied to a system preserved database `global_temp`
spark.sql("SELECT * FROM global_temp.people").show();
// +----+-------+
// | age| name|
// +----+-------+
// |null|Michael|
// | 30| Andy|
// | 19| Justin|
// +----+-------+
// Global temporary view is cross-session
spark.newSession().sql("SELECT * FROM global_temp.people").show();
// +----+-------+
// | age| name|
// +----+-------+
// |null|Michael|
// | 30| Andy|
// | 19| Justin|
// +----+-------+
这里重点说明:Global temporary view
是与系统保存的数据库global_temp
绑定到一起的;所以使用全局临时视图时,必须加上前缀global_temp
,即使是在本会话中也得加上;
df.createGlobalTempView("people");
//本会话中global_temp不加会报错。
Dataset<Row> sqlDF = spark.sql("select * from people");
sqlDF.show();
//新会话
spark.newSession().sql("select * from global_temp.people");
创建数据集 Dataset
首先假设我们有了一个java Bean
,名为Person
类。
public static class Person implements Serializable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
官方文档上讲了三种方式:
方式一、通过java Bean来创建数据集
import java.util.Arrays;
import java.util.Collections;
import java.io.Serializable;
import org.apache.spark.api.java.function.MapFunction;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.Encoder;
import org.apache.spark.sql.Encoders;
// Create an instance of a Bean class
Person person = new Person();
person.setName("Andy");
person.setAge(32);
// Encoders are created for Java beans
Encoder<Person> personEncoder = Encoders.bean(Person.class);
Dataset<Person> javaBeanDS = spark.createDataset(
Collections.singletonList(person),
personEncoder
);
javaBeanDS.show();
// +---+----+
// |age|name|
// +---+----+
// | 32|Andy|
// +---+----+
方式二、系统提供了许多常用的类编码器,比如Encoders.INT()
也就是通过官方用提供的编码器;
// Encoders for most common types are provided in class Encoders
Encoder<Integer> integerEncoder = Encoders.INT();
Dataset<Integer> primitiveDS = spark.createDataset(Arrays.asList(1, 2, 3), integerEncoder);
Dataset<Integer> transformedDS = primitiveDS.map(
(MapFunction<Integer, Integer>) value -> value + 1,
integerEncoder);
//这个不会打印出来,可以打断点看
transformedDS.collect(); // Returns [2, 3, 4]
方式三、通过提供的普通类将DataFrames 转为Dataset
// DataFrames can be converted to a Dataset by providing a class. Mapping based on name
String path = "examples/src/main/resources/people.json";
//spark.read().json(path) --- Dataset<Row> 这个就是DataFrames
Dataset<Person> peopleDS = spark.read().json(path).as(personEncoder);
peopleDS.show();
// +----+-------+
// | age| name|
// +----+-------+
// |null|Michael|
// | 30| Andy|
// | 19| Justin|
// +----+-------+