一:SparkSQL支持的外部数据源

1.支持情况

  

2.External LIbraries

  不是内嵌的,看起来不支持。

  但是现在已经有很多开源插件,可以进行支持。

3.参考材料

·  支持的格式:https://github.com/databricks

二:准备

1.启动服务

  RunJar是metastore服务,在hive那边开启。

  只需要启动三个服务就可以了,以后runjar都要启动,因为这里使用hive与spark集成了,不启动这个服务,就会总是报错。

  

2.启动spark-shell

  

三:测试检验程序

1.DataFrame的构成

  

2.结果

  

3.测试

  

4.结果

  

四:DataFrame的创建

1.创建SQLContext

  val sqlContext=new SQLContext(sc)

2.创建DataFrame(两种方式)

  val df=sqlContext.#

  val df=sqlContext.read.#

3.DataFrame数据转换

  val ndf=df.#.#

4.结果保存

  ndf.#

  ndf.write.#

五:DataFrame的保存

1.第一种方式

  将DataFrame转换为RDD,RDD数据保存

2.第二种方式

  直接通过DataFrame的write属性将数据写出。

  但是有限制,必须有定义类实现,默认情况:SparkSQL只支持parquet,json,jdbc

六:两个常用的网站(数据源问题)

1.金砖公司提供的一些插件

  

2.package网址

  https://spark-packages.org/

  

七:DataFrameReader编程模式

功能: 通过SQLContext提供的reader读取器读取外部数据源的数据,并形成DataFrame

1.源码的主要方法

  format:给定数据源数据格式类型,eg: json、parquet
  schema:给定读入数据的数据schema,可以不给定,不给定的情况下,进行数据类型推断
  option:添加参数,这些参数在数据解析的时候可能会用到
  load:
    有参数的指从参数给定的path路径中加载数据,比如:JSON、Parquet...
    无参数的指直接加载数据(根据option相关的参数)
  jdbc:读取关系型数据库的数据
  json:读取json格式数据
  parquet:读取parquet格式数据
  orc: 读取orc格式数据
  table:直接读取关联的Hive数据库中的对应表数据

八:Reader的程序测试

1.新建文件夹

  

2.上传数据

  

3.加载json数据

  val df=sqlContext.read.format("json").load("spark/sql/people.json")

  结果:

  

4.数据展示

  df.show()

  结果:

  

5.数据注册成临时表并操作展示

  

  结果:

  

6.和上面的方法等效的方式

  sqlContext.sql("select * from json.`spark/sql/people.json`").show()

  结果:

  

7.读取显示parquet格式的数据

  sqlContext.read.format("parquet").load("spark/sql/users.parquet").show()

  结果:

  

8.加载mysql中的数据

  这个是服务器上的mysql。

  sqlContext.read.jdbc("jdbc:mysql://linux-hadoop01.ibeifeng.com:3306/mysql?user=root&password=123456", "user", new java.util.Properties()).show()

  这个地方比较特殊。

  第一次使用bin/spark-shell进入后,使用命令,效果如下:

  

  然后使用这种方式进行启动,加上jar

   bin/spark-shell --jars /opt/softwares/mysql-connector-java-5.1.27-bin.jar --driver-class-path /opt/softwares/mysql-connector-java-5.1.27-bin.jar

  

九:DataFrameWriter编程模式

功能:将DataFrame的数据写出到外部数据源

1.源码主要方法

mode: 给定数据输出的模式
  `overwrite`: overwrite the existing data.
  `append`: append the data.
  `ignore`: ignore the operation (i.e. no-op).
  `error`: default option, throw an exception at runtime.
format:给定输出文件所属类型, eg: parquet、json
option: 给定参数
partitionBy:给定分区字段(要求输出的文件类型支持数据分区)
save: 触发数据保存操作 --> 当该API被调用后,数据已经写出到具体的数据保存位置了
jdbc:将数据输出到关系型数据库
  当mode为append的时候,数据追加方式是:
    先将表中的所有索引删除
    再追加数据

  没法实现,数据不存在就添加,存在就更新的需求

十:writer的程序测试

1.读取hive数据,形成DateFrame

  

2.结果保存为json格式

  自动创建存储目录。

  

  效果:

  

3.不再详细粘贴结果了

 读取Hive表数据形成DataFrame
val df = sqlContext.read.table("common.emp") 结果保存json格式
df.select("empno","ename").write.mode("ignore").format("json").save("/beifeng/result/json")
df.select("empno","ename").write.mode("error").format("json").save("/beifeng/result/json")
df.select("empno","ename", "sal").write.mode("overwrite").format("json").save("/beifeng/result/json")
df.select("empno","ename").write.mode("append").format("json").save("/beifeng/result/json")\
上面虽然在追加的时候加上了sal,但是解析没有问题
sqlContext.read.format("json").load("/beifeng/result/json").show() 结果保存parquet格式
df.select("empno", "ename", "deptno").write.format("parquet").save("/beifeng/result/parquet01")
df.select("empno", "ename","sal", "deptno").write.mode("append").format("parquet").save("/beifeng/result/parquet01") ## 加上sal导致解析失败,读取数据的时候 sqlContext.read.format("parquet").load("/beifeng/result/parquet01").show(100)
sqlContext.read.format("parquet").load("/beifeng/result/parquet01/part*").show(100) partitionBy按照给定的字段进行分区
df.select("empno", "ename", "deptno").write.format("parquet").partitionBy("deptno").save("/beifeng/result/parquet02")
sqlContext.read.format("parquet").load("/beifeng/result/parquet02").show(100)

  

040 DataFrame中的write与read编程的更多相关文章

  1. pandas | 详解DataFrame中的apply与applymap方法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是pandas数据处理专题的第5篇文章,我们来聊聊pandas的一些高级运算. 在上一篇文章当中,我们介绍了panads的一些计算方法, ...

  2. [引]MSDN Visual Basic 和 C# 中都会用到的编程概念

    本文转自:http://msdn.microsoft.com/zh-cn/library/dd460655.aspx 本节介绍 Visual Basic 和 C# 中都会用到的编程概念. 本节内容   ...

  3. pandas,对dataFrame中某一个列的数据进行处理

    背景:dataFrame的数据,想对某一个列做逻辑处理,生成新的列,或覆盖原有列的值   下面例子中的df均为pandas.DataFrame()的数据   1.增加新列,或更改某列的值 df[&qu ...

  4. [Spark][Python][DataFrame][RDD]DataFrame中抽取RDD例子

    [Spark][Python][DataFrame][RDD]DataFrame中抽取RDD例子 sqlContext = HiveContext(sc) peopleDF = sqlContext. ...

  5. python – 基于pandas中的列中的值从DataFrame中选择行

    如何从基于pandas中某些列的值的DataFrame中选择行?在SQL中我将使用: select * from table where colume_name = some_value. 我试图看看 ...

  6. Python中识别DataFrame中的nan

    # 识别python中DataFrame中的nanfor i in pfsj.index: if type(pfsj.loc[i]['WZML']) == float: print('float va ...

  7. [Spark][Python]DataFrame中取出有限个记录的例子

    [Spark][Python]DataFrame中取出有限个记录的例子: sqlContext = HiveContext(sc) peopleDF = sqlContext.read.json(&q ...

  8. STL中实现 iterator trail 的编程技巧

    STL中实现 iterator trail 的编程技巧 <泛型编程和 STL>笔记及思考. 这篇文章主要记录在 STL 中迭代器设计过程中出现的编程技巧,围绕的 STL 主题为 (迭代器特 ...

  9. 更改 pandas dataframe 中两列的位置

    更改 pandas dataframe 中两列的位置: 把其中的某列移到第一列的位置. 原来的 df 是: df = pd.read_csv('I:/Papers/consumer/codeandpa ...

随机推荐

  1. 解题:SHOI 2014 概率充电器

    题面 显然就是在求概率,因为期望乘的全是1....然后就推推推啊 设$fgg[i]$表示这个点父亲没给他充上电的概率,$sgg[i]$表示这个点子树(和它自己)没给他充上电的概率,然后这个点没充上电的 ...

  2. Nginx反向代理下IIS获取真实IP

    1. iis 如果放在反向代理后面,日志里的c-ip是反向代理服务器的ip,不是真正用户的ip,想要记录用户的ip要做两件事. 一.在反向代理设置X-Forwarded-For段,以下为nginx下的 ...

  3. c++并发编程之thread::join()和thread::detach()

    thread::join(): 阻塞当前线程,直至 *this 所标识的线程完成其执行.*this 所标识的线程的完成同步于从 join() 的成功返回. 该方法简单暴力,主线程等待子进程期间什么都不 ...

  4. CSS表格均匀边框

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  5. 浮动和margin-left负值的有趣现象

    我将第二个浮动的元素的margin-left的值不断减小: 被设置元素左移,后面的元素跟着动 当被设置元素的右边界超过了前面元素的左边界,后面边的元素被前面的元素挡在外面了

  6. freemark+ITextRenderer 生成PDF,设置pdf的页面大小

    在html中添加样式,仅生成pdf是生效,浏览器展示时是不会生效的: <style> @page{ size : 200mm  300 mm;   } </style>

  7. SQL语句(九)使用特殊关系运算符查询

    使用特殊关系运算符查询 特殊关系运算符 IN.NOT IN IS NULL.IS NOT NULL BETWEEN.NOT BETWEEN LIKE.NOT LIKE IN , NOT IN IN 在 ...

  8. Does Deep Learning Come from the Devil?

    Does Deep Learning Come from the Devil? Deep learning has revolutionized computer vision and natural ...

  9. OnContextMenu事件(转)

    用oncontextmenu事件单禁用右键菜单 一个页面中,BODY中用oncontextmenu='return false'来取消鼠标右键:在JS中设置oncontextmenu='return ...

  10. AngularJS入门基础——控制器

    AngularJS中的控制器是一个函数,用来向视图的作用域添加额外的功能.我们用它来给作用域对象设置初始状态,并添加自定义行为. AngularJS同其他JavaScript框架最主要的一个区别就是, ...