spark sql 编程笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 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|
// +----+-------+

猜你喜欢

转载自blog.csdn.net/u013066244/article/details/80744832