SparkSQL(一)--(SQL+DataFrame+functions+DataSet)

本文介绍了Hadoop生态系统中的各种SQL框架,包括Hive、Impala、Presto、SparkSQL等,详细对比了它们的特点和应用场景,特别强调了SparkSQL与Hive的集成使用方法。

常见的SQL On Hadoop框架

  • hive(非常重要):最原始的on hadoop的方案,由facebook贡献;将sql转化为底层MR/Tez/Spark作业;hive的metastore存储了表和库的所有信息,而且他几乎是和所有 on hadoop的框架通用的,hive2.x.x版本速度上有了很大提升
  • impala(生产上很少用):可以使用hive的metastore,它推荐的数据格式是parquet,故我们可以通过spark sql 将文本格式等数据转换为parquet格式
  • presto(生产上很少用):facebook出产。DJ用的最多
  • shark(淘汰):spark sql的前生,将spqrksql转换为RDD进行操作,已经舍弃
  • drill(生产上很少用):可以用sql操作Habse、hdfs、s3、hive、等各种不同组件上的数据
  • phoenix(重要):架构在Hbase之上的一种查询组件、(必选)可以用sql查询Hbase数据,也支持与spark、hive、kafka交互等,如引入phoenix-spark相关jar包后,spark可读取phoenix数据以及存储数据到phoenix上,可在github.com/apache/phoenix查看
  • Spark SQL(极其重要):是spark的一个模块,用于出来结构化数据,它相较于RDD,底层自己会做一些优化。
  • Hive、impala、prestore、spark sql 他们都是能共用一套MetaStore,故他们互相间的计算访问或迁移是非常简单的,没有任何壁垒

 

Spark  SQL 简介

误区

  • spark sql就是写sql!这个说法是非常片面的,它是通过sql、DataFrame、DataSet来处理结构化的数据
  • hive on spark 就是spark sql!完全错误的观念,两个是完全不同的概念,完全不是同一个东西

spark sql的版本历史

  • Shark:1.0之后被遗弃
  • Spark SQL诞生版本:1.0
  • spark SQL正式版本:1.3版本,此版本中推出了DataFrame,取代了原有的ShchemaRDD
  • Spark SQL DataSet诞生:1.6版本,他更加的强约束

SQL

  • spark sql 和hive的sql语法几乎没有区别,主要用于查询数据。而且生产上代码应多食用DF和DS的API避免直接使用SQL,因为一般做的是平台,是针对用户的web UI上的sql进行API封装,其次SQL不能让错误在编译时提前发现,sql写错了,也是申请到资源后Executor运行时报错,并不友好

 

SQL Combiner Hive(重要)

  • 由于Spark SQL 与Hive可共用一套MetaStore,故Spark SQL 可通过Hive的MetaStore来访问操作hive上的数据(会Spark SQL 后Hive是真的可以被彻底放弃了)。
  1. 第一步:将hive-site.xml文件拷贝到Spark的conf目录下即可
  2. 第二步:将mysql的jdbc  jar通过-jar以及-driver -class传给spark,注意虽然可cp jar到lib目录下,但是会使所有的作业生效,这样会影响别人不可取,可通过Spark UI查看相关的jars。
  • 通过spark-shell脚本操作hive

[hadoop@hadoop001 lib]$ spark-shell --master local[2]  --jars /home/hadoop/lib/mysql-connector-java.jar  --driver-class-path  /home/hadoop/lib/mysql-connector-java.jar

19/06/17 15:10:38 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Spark context Web UI available at http://hadoop001:4040
Spark context available as 'sc' (master = local[2], app id = local-1560755459155).
Spark session available as 'spark'.
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 2.4.2
      /_/
         
Using Scala version 2.11.12 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_161)
Type in expressions to have them evaluated.
Type :help for more information.

scala> 

scala> spark.sql("show databases").show
+------------+
|databaseName|
+------------+
|     default|
|   hadoop_g6|
|    ruoze_d6|
+------------+

scala> spark.sql("use default").show()
++
||
++
++


scala> spark.sql("show tables").show()
+--------+-------------------+-----------+
|database| tableName|isTemporary|
+--------+-------------------+-----------+
| default| customer| false|
| default| dual| false|
| default| g6_access| false|
| default| g6_access_lzo| false|
| default|g6_access_lzo_split| false|
| default| g6_access_orc| false|
| default| g6_access_orc_none| false|
| default| g6_access_par| false|
| default| g6_access_par_zip| false|
| default| g6_access_rc| false|
| default| g6_access_seq| false|
| default| makedata_job| false|
| default| order| false|
| default| traffic_info| false|
| default| tv_info| false|
+--------+-------------------+-----------+

 

  

  • 通过spark-sql脚本操作hive

[hadoop@hadoop001 bin]$ ./spark-sql --jars /home/hadoop/lib/mysql-connector-java.jar  --driver-class-path  /home/hadoop/lib/mysql-connector-java.jar
spark-sql (default)> show tables;

default customer false
default dual false
default g6_access false
default g6_access_lzo false
default g6_access_lzo_split false
default g6_access_orc false
default g6_access_orc_none false
default g6_access_par false
default g6_access_par_zip false
default g6_access_rc false
default g6_access_seq false
default makedata_job false
default order false
default traffic_info false
default tv_info false
Time taken: 13.567 seconds, Fetched 15 row(s)

  • 通过Spark的beeline操作hive

[hadoop@hadoop001 sbin]$ /home/hadoop/app/spark-2.4.2-bin-2.6.0-cdh5.7.0/sbin/start-thriftserver.sh   --jars /home/hadoop/lib/mysql-connector-java.jar  --driver-class-path  /home/hadoop/lib/mysql-connector-java.jar
starting org.apache.spark.sql.hive.thriftserver.HiveThriftServer2, logging to /home/hadoop/app/spark-2.4.2-bin-2.6.0-cdh5.7.0/logs/spark-hadoop-org.apache.spark.sql.hive.thriftserver.HiveThriftServer2-1-hadoop001.out
[hadoop@hadoop001 sbin]$ /home/hadoop/app/spark-2.4.2-bin-2.6.0-cdh5.7.0/bin/beeline -u jdbc:hive2://hadoop001:10000/default -

Connecting to jdbc:hive2://hadoop001:10000/default
19/06/17 15:27:31 INFO jdbc.Utils: Supplied authorities: hadoop001:10000
19/06/17 15:27:31 INFO jdbc.Utils: Resolved authority: hadoop001:10000
19/06/17 15:27:32 INFO jdbc.HiveConnection: Will try to open client transport with JDBC Uri: jdbc:hive2://hadoop001:10000/default
Connected to: Spark SQL (version 2.4.2)
Driver: Hive JDBC (version 1.2.1.spark2)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 1.2.1.spark2 by Apache Hive
0: jdbc:hive2://hadoop001:10000/default> show tables;


+-----------+----------------------+--------------+--+
| database | tableName | isTemporary |
+-----------+----------------------+--------------+--+
| default | customer | false |
| default | dual | false |
| default | g6_access | false |
| default | g6_access_lzo | false |
| default | g6_access_lzo_split | false |
| default | g6_access_orc | false |
| default | g6_access_orc_none | false |
| default | g6_access_par | false |
| default | g6_access_par_zip | false |
| default | g6_access_rc | false |
| default | g6_access_seq | false |
| default | makedata_job | false |
| default | order | false |
| default | traffic_info | false |
| default | tv_info | false |
+-----------+----------------------+--------------+--+
15 rows selected (2.899 seconds)
0: jdbc:hive2://hadoop001:10000/default>

 

 

RDD and DataSet and DataFrame关系

  • RDD很多高级函数操作(map、fileter、sort等)DataSet、DataFrame都会有
  • RDD[T],spark并不知道T的具体结构,而DataSet、DataFrame,spark会了解其结构
  • DataSet==RDD[Row]、DataFrame=RDD+Schema
  • DataSet、DataFrame可直接转换为RDD
  • DataSet可通过RDD[Row]货DF生成
  • DataFrame可通过RDD[CaseClass]或者[Row]+Schema

 

  • SparkSession对象

SparkSession它是所有编程的入口,所有的context都可有通过它获取,创建方式如下:

val spark = SparkSession.builder().appName("XX").master("local[2]").config("XX","XX").getOrCreate()

spark.stop()

  

 

转载于:https://www.cnblogs.com/xuziyu/p/11044910.html

标题SpringBoot智能在线预约挂号系统研究AI更换标题第1章引言介绍智能在线预约挂号系统的研究背景、意义、国内外研究现状及论文创新点。1.1研究背景与意义阐述智能在线预约挂号系统对提升医疗服务效率的重要性。1.2国内外研究现状分析国内外智能在线预约挂号系统的研究与应用情况。1.3研究方法及创新点概述本文采用的技术路线、研究方法及主要创新点。第2章相关理论总结智能在线预约挂号系统相关理论,包括系统架构、开发技术等。2.1系统架构设计理论介绍系统架构设计的基本原则和常用方法。2.2SpringBoot开发框架理论阐述SpringBoot框架的特点、优势及其在系统开发中的应用。2.3数据库设计与管理理论介绍数据库设计原则、数据模型及数据库管理系统。2.4网络安全与数据保护理论讨论网络安全威胁、数据保护技术及其在系统中的应用。第3章SpringBoot智能在线预约挂号系统设计详细介绍系统的设计方案,包括功能模块划分、数据库设计等。3.1系统功能模块设计划分系统功能模块,如用户管理、挂号管理、医生排班等。3.2数据库设计与实现设计数据库表结构,确定字段类型、主键及外键关系。3.3用户界面设计设计用户友好的界面,提升用户体验。3.4系统安全设计阐述系统安全策略,包括用户认证、数据加密等。第4章系统实现与测试介绍系统的实现过程,包括编码、测试及优化等。4.1系统编码实现采用SpringBoot框架进行系统编码实现。4.2系统测试方法介绍系统测试的方法、步骤及测试用例设计。4.3系统性能测试与分析对系统进行性能测试,分析测试结果并提出优化建议。4.4系统优化与改进根据测试结果对系统进行优化和改进,提升系统性能。第5章研究结果呈现系统实现后的效果,包括功能实现、性能提升等。5.1系统功能实现效果展示系统各功能模块的实现效果,如挂号成功界面等。5.2系统性能提升效果对比优化前后的系统性能
在金融行业中,对信用风险的判断是核心环节之,其结果对机构的信贷政策和风险控制策略有直接影响。本文将围绕如何借助机器学习方法,尤其是Sklearn工具包,建立用于判断信用状况的预测系统。文中将涵盖逻辑回归、支持向量机等常见方法,并通过实际操作流程进行说明。 、机器学习基本概念 机器学习属于人工智能的子领域,其基本理念是通过数据自动学习规律,而非依赖人工设定规则。在信贷分析中,该技术可用于挖掘历史数据中的潜在规律,进而对未来的信用表现进行预测。 二、Sklearn工具包概述 Sklearn(Scikit-learn)是Python语言中广泛使用的机器学习模块,提供多种数据处理和建模功能。它简化了数据清洗、特征提取、模型构建、验证与优化等流程,是数据科学项目中的常用工具。 三、逻辑回归模型 逻辑回归是种常用于分类任务的线性模型,特别适用于二类问题。在信用评估中,该模型可用于判断借款人是否可能违约。其通过逻辑函数将输出映射为0到1之间的概率值,从而表示违约的可能性。 四、支持向量机模型 支持向量机是种用于监督学习的算法,适用于数据维度高、样本量小的情况。在信用分析中,该方法能够通过寻找最佳分割面,区分违约与非违约客户。通过选用不同核函数,可应对复杂的非线性关系,提升预测精度。 五、数据预处理步骤 在建模前,需对原始数据进行清理与转换,包括处理缺失值、识别异常点、标准化数值、筛选有效特征等。对于信用评分,常见的输入变量包括收入水平、负债比例、信用历史记录、职业稳定性等。预处理有助于减少噪声干扰,增强模型的适应性。 六、模型构建与验证 借助Sklearn,可以将数据集划分为训练集和测试集,并通过交叉验证调整参数以提升模型性能。常用评估指标包括准确率、召回率、F1值以及AUC-ROC曲线。在处理不平衡数据时,更应关注模型的召回率与特异性。 七、集成学习方法 为提升模型预测能力,可采用集成策略,如结合多个模型的预测结果。这有助于降低单模型的偏差与方差,增强整体预测的稳定性与准确性。 综上,基于机器学习的信用评估系统可通过Sklearn中的多种算法,结合合理的数据处理与模型优化,实现对借款人信用状况的精准判断。在实际应用中,需持续调整模型以适应市场变化,保障预测结果的长期有效性。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
### Spark SQL Dataset 使用指南与常见问题解决方案 #### 1. Dataset 的基本概念 DatasetSpark 1.6 引入的种强类型的数据集,它是 DataFrame 的升级版[^4]。Dataset 支持使用 lambda 表达式进行操作,并且在功能上兼容大部分 DataFrame 的 API。此外,Dataset 还提供了编译时类型检查,这使得它在处理复杂业务逻辑时更加安全和高效。 #### 2. Dataset 的创建方式 Dataset 可以通过多种方式创建,包括从本地集合、RDD 转换以及读取外部数据源等。以下是些常见的创建方法: - **从本地集合创建**: ```scala val spark = SparkSession.builder().appName("DatasetExample").getOrCreate() import spark.implicits._ val data = Seq(("Alice", 25), ("Bob", 30)) val dataset = data.toDS() // 创建Dataset[(String, Int)] ``` - **从 RDD 转换**: ```scala val rdd = spark.sparkContext.parallelize(Seq(("Alice", 25), ("Bob", 30))) val dataset = rdd.toDS() // 将 RDD 转换为 Dataset ``` - **从外部数据源读取**: ```scala val df = spark.read.format("csv").option("header", "true").load("path/to/file.csv") val dataset = df.as[YourCaseClass] // 将 DataFrame 转换为 Dataset[YourCaseClass] ``` #### 3. Dataset 的常用操作 Spark SQL 提供了丰富的函数来支持对 Dataset 的操作,这些函数可以分为以下几类: - **转换操作**:如 `map`、`flatMap`、`filter` 等。 - **动作操作**:如 `collect`、`count`、`show` 等。 - **聚合操作**:如 `groupBy`、`agg` 等。 示例代码: ```scala // 转换操作 val filteredDataset = dataset.filter(row => row._2 > 30) // 过滤年龄大于 30 的记录 // 动作操作 filteredDataset.show() // 显示结果 // 聚合操作 dataset.groupBy("name").agg(Map("age" -> "avg")).show() // 按姓名分组并计算平均年龄 ``` #### 4. 自定义函数的使用 如果内置函数无法满足需求,用户可以自定义 Spark SQL 函数,并将其应用于 Dataset 的处理中[^1]。例如,定义个 UDF(用户定义函数): ```scala import org.apache.spark.sql.functions.udf val agePlusTen = udf((age: Int) => age + 10) val result = dataset.withColumn("new_age", agePlusTen(col("age"))) result.show() ``` #### 5. Dataset 的保存操作 Dataset 支持将处理后的数据保存到多种格式的文件中,如 CSV、JSON、Parquet 等。以下是个保存为文本文件的示例[^2]: ```scala val dataset1 = dataset.map(row => s"${row._1} ${row._2}") dataset1.write.mode(SaveMode.Overwrite).text("output_path") ``` #### 6. 常见问题及解决方案 - **问题 1**:如何解决 Dataset 中的空值问题? - 解决方案:可以使用 `na.fill` 方法填充空值,或者使用 `filter` 方法过滤掉包含空值的记录[^3]。 - **问题 2**:DatasetDataFrame 的区别是什么? - 解决方案:Dataset 是强类型的,支持编译时类型检查,而 DataFrame 是弱类型的,表示为 `DataSet[Row]`[^4]。 - **问题 3**:如何优化 Dataset 的性能? - 解决方案:可以通过调整分区数、启用广播连接等方式优化性能[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值