Spark Chapter 8 Spark SQL

【参考 以慕课网日志分析为例 进入大数据Sparksql】

0 导读

SQL:MySQL,Oracle,DB2,SQLServer

在大数据平台上实现大数据计算:Hive / Spark SQL / Spark Core

直接使用SQL语句进行大数据分析

hive的问题:底层MR,2.x之后可以用spark


应用场景


SQL on Hadoop:Hive,Shark(不维护了),Impala(Cloudera,内存使用较多),Presto(京东使用较多),Drill


Hive:on MapReduce,翻译为MR语句,在Hadoop Cluster运行。由于shuffle要落地,速度较慢,进程级别的。


Shark: on Spark,基于Hive源码改造。


Spark SQL:on Spark,是由自己的执行计划解析的。


共同点:matestore:表名,字段名,顺序是什么,数据类型是什么,存储位置  存在mysql上


补充: Hive on Spark:底层是hive的基础上添加引擎叫spark


1 Spark SQL概述

park SQL is a Spark module for structured data processing. 


Integrated——集成

可以查询结构化的数据,用sql;或者使用DF API。

支持Java, Scala, Python and R.


uniform Data Access——链接到数据源

Connect to any data source the same way.

DataFrames and SQL provide a common way to access a variety of data sources, including Hive, Avro, Parquet, ORC, JSON, and JDBC. You can even join data across these sources.


spark.read.json("s3n://...").registerTempTable("json")

results = spark.sql( """SELECT * FROM peopleJOIN json ...""")

Hive Integration

可以和hive无缝对接

Spark SQL supports the HiveQL syntax as well as Hive SerDes and UDFs, allowing you to access existing Hive warehouses.

Standard Connectivity

标准的JDBC/ODBC链接其他内容


hive不只是sql

spark sql :是一个spark模块,可以处理结构化数据,支持SQL和DF dataset API。


用于处理结构化数据的组间,结构化是数据,而非sql

2 Spark SQL架构


3 DataFrame/Dataset详解

概述

dataset 1.6 版本添加进来的

以列的方式组成的数据集

以列名,列类型, 列值

A DataFrame is a Dataset organized into named columns. It is conceptually equivalent to a table in a relational database or a data frame in R/Python, but with richer optimizations under the hood. DataFrames can be constructed from a wide array of sources such as: structured data files, tables in Hive, external databases, or existing RDDs. The DataFrame API is available in Scala, Java, Python, and R. In Scala and Java, a DataFrame is represented by a Dataset of Rows. In the Scala API, DataFrame is simply a type alias of Dataset[Row]. While, in Java API, users need to use Dataset<Row> to represent a DataFrame.


【面试题】RDD与DataFrame的区别


编程

The entry point into all functionality in Spark is the SparkSession class. To create a basic SparkSession, just use SparkSession.builder:

from pyspark.sql import SparkSession

spark = SparkSession \

    .builder \

    .appName("Python Spark SQL basic example") \

    .config("spark.some.config.option", "some-value") \

    .getOrCreate()


在IDE中编:在ide中运行比较慢,在pyspark中运行比较快。

from pyspark.sql import SparkSession

def basic(spark):

  df=spark.read.json("文件名")

  df.show()

  df.printSchema() //显示表结构

  df.select("name").show()

  df.select("*").show()

  df.select("name","age").show()

  df.select(df["name"],df["age"]+1).show()

  df.filter(df['age'] > 21).show()

  df.filter(df.age> 21).show()

  df.groupBy("age").count().show()

def basic2(spark):

    df = spark.read.json("文件名")

    // 把df注册成people表,创建临时视图

    df.createOnReplaceTempView("people") 

    sqlDF = spark.sql("SELECT * FROM people")

    sqlDF.show()

    // df.createOnGlobalTempView("people") 创建全局视图,不常用

    // sqlDF = spark.sql("SELECT * FROM global_temp.people")

if _name_ =='__main__':

  spark = SparkSession.builder.appName("spark0801").getOrCreate()

  basic(spark)

如果报错deaby已经存在 需要在hadoop的sbin目录下删除metastore_db


ps:

more +文件名 查看文件内容


DF与RDD相互转换

Spark SQL supports two different methods for converting existing RDDs into Datasets. 

1 reflection

def new1(spark):

  sc = spark.sparkContext

  # Load a text file and convert each line to a Row.

  lines = sc.textFile("examples/src/main/resources/people.txt")

  parts = lines.map(lambda l: l.split(","))

  people = parts.map(lambda p: Row(name=p[0], age=int(p[1])))

  # Infer the schema, and register the DataFrame as a table.

  schemaPeople = spark.createDataFrame(people)

  schemaPeople.printSchema()- 显示DF的元数据信息

  schemaPeople.createOrReplaceTempView("people")

  # SQL can be run over DataFrames that have been registered as a table.

  teenagers = spark.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19")

  # The results of SQL queries are Dataframe objects.

  # rdd returns the content as an :class:`pyspark.RDD` of :class:`Row`.

  teenNames = teenagers.rdd.map(lambda p: "Name: " + p.name).collect()

  for name in teenNames:

    print(na


2  用schema的方式

比较灵活,但是代码较多。

Create an RDD of tuples or lists from the original RDD;

Create the schema represented by a StructType matching the structure of tuples or lists in the RDD created in the step 1.

Apply the schema to the RDD via createDataFrame method provided by SparkSession.

from pyspark.sql.types import *

def new2(Spark):

  sc = spark.sparkContext

  # Load a text file and convert each line to a Row.

  lines = sc.textFile("examples/src/main/resources/people.txt") 

  parts = lines.map(lambda l: l.split(","))

  # Each line is converted to a tuple.

  people = parts.map(lambda p: (p[0], p[1].strip()))

  # The schema is encoded in a string.

  schemaString = "name age"

  fields = [StructField(field_name, StringType(), True) for field_name in schemaString.split()]

    schema = StructType(fields)

  # Apply the schema to the RDD.

  schemaPeople = spark.createDataFrame(people, schema)

  # Creates a temporary view using the DataFrame

  schemaPeople.createOrReplaceTempView("people")

  # SQL can be run over DataFrames that have been registered as a table.

  results = spark.sql("SELECT name FROM people")

  results.s


data soure 自己学习

还有和JDBC的交互

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容