首页数据库spark数据库 spark sql表中怎样获取字段名及字段类型

spark数据库 spark sql表中怎样获取字段名及字段类型

编程之家2023-10-22107次浏览

其实spark数据库的问题并不复杂,但是又很多的朋友都不太了解spark sql表中怎样获取字段名及字段类型,因此呢,今天小编就来为大家分享spark数据库的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

spark数据库 spark sql表中怎样获取字段名及字段类型

hadoop,storm和spark的区别,比较

一、hadoop、Storm该选哪一个?

为了区别hadoop和Storm,该部分将回答如下问题:

1.hadoop、Storm各是什么运算

2.Storm为什么被称之为流式计算系统

3.hadoop适合什么场景,什么情况下使用hadoop

4.什么是吞吐量

spark数据库 spark sql表中怎样获取字段名及字段类型

首先整体认识:Hadoop是级计算,进行计算时,数据在磁盘上,需要读写磁盘;Storm是内存级计算,数据直接通过网络导入内存。读写内存比读写磁盘速度快n个数量级。根据Harvard CS61课件,磁盘访问延迟约为内存访问延迟的75000倍。所以Storm更快。

注释:

1.延时,指数据从产生到运算产生结果的时间,“快”应该主要指这个。

2.吞吐,指系统单位时间处理的数据量。

storm的网络直传、内存计算,其时延必然比hadoop的通过hdfs传输低得多;当计算模型比较适合流式时,storm的流式处理,省去了批处理的收集数据的时间;因为storm是服务型的作业,也省去了作业调度的时延。所以从时延上来看,storm要快于hadoop。

从原理角度来讲:

spark数据库 spark sql表中怎样获取字段名及字段类型

Hadoop M/R基于HDFS,需要切分输入数据、产生中间数据文件、排序、数据压缩、多份复制等,效率较低。

Storm基于ZeroMQ这个高性能的消息通讯库,不持久化数据。

为什么storm比hadoop快,下面举一个应用场景

说一个典型的场景,几千个日志生产方产生日志文件,需要进行一些ETL操作存入一个数据库。

假设利用hadoop,则需要先存入hdfs,按每一分钟切一个文件的粒度来算(这个粒度已经极端的细了,再小的话hdfs上会一堆小文件),hadoop开始计算时,1分钟已经过去了,然后再开始调度任务又花了一分钟,然后作业运行起来,假设机器特别多,几钞钟就算完了,然后写数据库假设也花了很少的时间,这样,从数据产生到最后可以使用已经过去了至少两分多钟。

而流式计算则是数据产生时,则有一个程序去一直监控日志的产生,产生一行就通过一个传输系统发给流式计算系统,然后流式计算系统直接处理,处理完之后直接写入,每条数据从产生到写入数据库,在资源充足时可以在毫秒级别完成。

同时说一下另外一个场景:

如果一个大文件的wordcount,把它放到storm上进行流式的处理,等所有已有数据处理完才让storm输出结果,这时候,你再把它和hadoop比较快慢,这时,其实比较的不是时延,而是比较的吞吐了。

--------------------------------------------------------------------------------------------------------------------------------

最主要的方面:Hadoop使用作为中间交换的介质,而storm的数据是一直在内存中流转的。

两者面向的领域也不完全相同,一个是批量处理,基于任务调度的;另外一个是实时处理,基于流。

以水为例,Hadoop可以看作是纯净水,一桶桶地搬;而Storm是用水管,预先接好(Topology),然后打开水龙头,水就源源不断地流出来了。

--------------------------------------------------------------------------------------------------------------------------------

Storm的主工程师Nathan Marz表示: Storm可以方便地在一个计算机集群中编写与扩展复杂的实时计算,Storm之于实时处理,就好比Hadoop之于批处理。Storm保证每个消息都会得到处理,而且它很快——在一个小集群中,每秒可以处理数以百万计的消息。更棒的是你可以使用任意编程语言来做开发。

Storm的主要特点如下:

1.简单的模型。类似于MapReduce降低了并行批处理复杂性,Storm降低了进行实时处理的复杂性。

2.可以使用各种。你可以在Storm之上使用各种编程语言。默认支持Clojure、Java、Ruby和Python。要增加对其他语言的支持,只需实现一个简单的Storm通信协议即可。

3.容错性。Storm会管理工作进程和节点的故障。

4.水平扩展。计算是在多个线程、进程和服务器之间并行进行的。

5.可靠的消息处理。Storm保证每个消息至少能得到一次完整处理。任务失败时,它会负责从消息源重试消息。

6.快速。系统的设计保证了消息能得到快速的处理,使用MQ作为其底层消息队列。

7.本地模式。Storm有一个“本地模式”,可以在处理过程中完全模拟Storm集群。这让你可以快速进行开发和单元测试。

--------------------------------------------------------------------------------------------------------------------------------

在消耗资源相同的情况下,一般来说storm的延时低于mapreduce。但是吞吐也低于mapreduce。storm是典型的流计算系统,mapreduce是典型的批处理系统。下面对流计算和批处理系统流程

这个个数据处理流程来说大致可以分三个阶段:

1.数据采集与准备

2.数据计算(涉及计算中的中间存储),题主中的“那些方面决定”应该主要是指这个阶段处理方式。

3.数据结果展现(反馈)

1)阶段,目前典型的处理处理策略:数据的产生系统一般出自页面打点和解析DB的log,流计算将数据采集中消息队列(比如kafaka,metaQ,timetunle)等。批处理系统一般将数据采集进分布式文件系统(比如HDFS),当然也有使用消息队列的。我们暂且把消息队列和文件系统称为预处理存储。二者在延时和吞吐上没太大区别,接下来从这个预处理存储进入到数据计算阶段有很大的区别,流计算一般在实时的读取消息队列进入流计算系统(storm)的数据进行运算,批处理一系统一般会攒一大批后批量导入到计算系统(hadoop),这里就有了延时的区别。

2)数据计算阶段,流计算系统(storm)的延时低主要有一下几个方面(针对题主的问题)

A: storm进程是常驻的,有数据就可以进行实时的处理

mapreduce数据攒一批后由作业管理系统启动任务,Jobtracker计算任务分配,tasktacker启动相关的运算进程

B: stom每个计算单元之间数据之间通过网络(zeromq)直接传输。

mapreduce map任务运算的结果要写入到HDFS,在于reduce任务通过网络拖过去运算。相对来说多了读写,比较慢

C:对于复杂运算

storm的运算模型直接支持DAG(有向无环图)

mapreduce需要肯多个MR过程组成,有些map操作没有意义的

3)数据结果展现

流计算一般运算结果直接反馈到最终结果集中(展示页面,,搜索引擎的索引)。而mapreduce一般需要整个运算结束后将结果批量导入到结果集中。

实际流计算和批处理系统没有本质的区别,像storm的trident也有批概念,而mapreduce可以将每次运算的数据集缩小(比如几分钟启动一次),facebook的puma就是基于hadoop做的流计算系统。

二、高性能并行计算引擎Storm和Spark比较

Spark基于这样的理念,当数据庞大时,把计算过程传递给数据要比把数据传递给计算过程要更富效率。每个节点存储(或缓存)它的数据集,然后任务被提交给节点。

所以这是把过程传递给数据。这和Hadoopmap/reduce非常相似,除了积极使用内存来避免I/O操作,以使得迭代算法(前一步计算输出是下一步计算的输入)性能更高。

Shark只是一个基于Spark的查询引擎(支持ad-hoc临时性的分析查询)

而Storm的架构和Spark截然相反。Storm是一个分布式流计算引擎。每个节点实现一个基本的计算过程,而数据项在互相连接的网络节点中流进流出。和Spark相反,这个是把数据传递给过程。

两个框架都用于处理大量数据的并行计算。

Storm在动态处理大量生成的“小数据块”上要更好(比如在Twitter数据流上实时计算一些汇聚功能或分析)。

Spark工作于现有的数据全集(如Hadoop数据)已经被导入Spark集群,Spark基于in-memory管理可以进行快讯扫描,并最小化迭代算法的全局I/O操作。

不过Spark流模块(StreamingModule)倒是和Storm相类似(都是流计算引擎),尽管并非完全一样。

Spark流模块先汇聚批量数据然后进行数据块分发(视作不可变数据进行处理),而Storm是只要接收到数据就实时处理并分发。

不确定哪种方式在数据吞吐量上要具优势,不过Storm计算时间延迟要小。

总结下,Spark和Storm设计相反,而SparkSteaming才和Storm类似,前者有数据平滑窗口(slidingwindow),而后者需要自己去维护这个窗口。

spark sql表中怎样获取字段名及字段类型

Java获取数据库的表中各字段的字段名,代码如下:

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.PreparedStatement;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

public class TestDemo{

public static Connection getConnection(){

Connection conn= null;

try{

Class.forName("com.mysql.jdbc.Driver");

String url="jdbc:mysql://数据库IP地址:3306/数据库名称";

String user="数据库用户名";

String pass="数据库用户密码";

conn= DriverManager.getConnection(url, user, pass);

} catch(ClassNotFoundException e){

e.printStackTrace();

} catch(SQLException e){

e.printStackTrace();

}

return conn;

}

public static void main(String[] args){

Connection conn= getConnection();

String sql="select* from AccessType";

PreparedStatement stmt;

try{

stmt= conn.prepareStatement(sql);

ResultSet rs= stmt.executeQuery(sql);

ResultSetMetaData data= rs.getMetaData();

for(int i= 1; i<= data.getColumnCount(); i++){

//获得所有列的数目及实际列数

int columnCount= data.getColumnCount();

//获得指定列的列名

String columnName= data.getColumnName(i);

//获得指定列的列值

int columnType= data.getColumnType(i);

//获得指定列的数据类型名

String columnTypeName= data.getColumnTypeName(i);

//所在的Catalog名字

String catalogName= data.getCatalogName(i);

//对应数据类型的类

String columnClassName= data.getColumnClassName(i);

//在数据库中类型的最大字符个数

int columnDisplaySize= data.getColumnDisplaySize(i);

//默认的列的标题

String columnLabel= data.getColumnLabel(i);

//获得列的模式

String schemaName= data.getSchemaName(i);

//某列类型的精确度(类型的长度)

int precision= data.getPrecision(i);

//小数点后的位数

int scale= data.getScale(i);

//获取某列对应的表名

String tableName= data.getTableName(i);

//是否自动递增

boolean isAutoInctement= data.isAutoIncrement(i);

//在数据库中是否为货币型

boolean isCurrency= data.isCurrency(i);

//是否为空

int isNullable= data.isNullable(i);

//是否为只读

boolean isReadOnly= data.isReadOnly(i);

//能否出现在where中

boolean isSearchable= data.isSearchable(i);

System.out.println(columnCount);

System.out.println("获得列"+ i+"的字段名称:"+ columnName);

System.out.println("获得列"+ i+"的类型,返回SqlType中的编号:"+ columnType);

System.out.println("获得列"+ i+"的数据类型名:"+ columnTypeName);

System.out.println("获得列"+ i+"所在的Catalog名字:"+ catalogName);

System.out.println("获得列"+ i+"对应数据类型的类:"+ columnClassName);

System.out.println("获得列"+ i+"在数据库中类型的最大字符个数:"+ columnDisplaySize);

System.out.println("获得列"+ i+"的默认的列的标题:"+ columnLabel);

System.out.println("获得列"+ i+"的模式:"+ schemaName);

System.out.println("获得列"+ i+"类型的精确度(类型的长度):"+ precision);

System.out.println("获得列"+ i+"小数点后的位数:"+ scale);

System.out.println("获得列"+ i+"对应的表名:"+ tableName);

System.out.println("获得列"+ i+"是否自动递增:"+ isAutoInctement);

System.out.println("获得列"+ i+"在数据库中是否为货币型:"+ isCurrency);

System.out.println("获得列"+ i+"是否为空:"+ isNullable);

System.out.println("获得列"+ i+"是否为只读:"+ isReadOnly);

System.out.println("获得列"+ i+"能否出现在where中:"+ isSearchable);

}

} catch(SQLException e){

e.printStackTrace();

}

}

}

sparkSQL和spark有什么区别

Spark为结构化数据处理引入了一个称为Spark SQL的编程模块。简而言之,sparkSQL是Spark的前身,是在Hadoop发展过程中,为了给熟悉RDBMS但又不理解MapReduce的技术人员提供快速上手的工具。

sparkSQL提供了一个称为DataFrame(数据框)的编程抽象,DF的底层仍然是RDD,并且可以充当分布式SQL查询引擎。

SparkSql有哪些特点呢?

1)引入了新的RDD类型SchemaRDD,可以像传统数据库定义表一样来定义SchemaRDD。

2)在应用程序中可以混合使用不同来源的数据,如可以将来自HiveQL的数据和来自SQL的数据进行Join操作。

3)内嵌了查询优化框架,在把SQL解析成逻辑执行计划之后,最后变成RDD的计算。

文章到此结束,如果本次分享的spark数据库和spark sql表中怎样获取字段名及字段类型的问题解决了您的问题,那么我们由衷的感到高兴!

西安教育统计基础数据库平台?西安电子科技大学教务处电话名字数据库 如何查看数据库名称