相关文章推荐
强健的毛豆  ·  Spring Boot ...·  2 月前    · 
豪情万千的山羊  ·  Python|使用PUSH ...·  11 月前    · 
爱旅游的盒饭  ·  jQuery ...·  1 年前    · 

结构化数据

结构化数据源对数据定义了一种模式。通过这些关于底层数据的额外信息,结构化数据源提供高效的存储和性能。例如,列式数据存储Parquet和ORC,使得从一个列子集中提取数据更加容易。当数据查询只需要获取一少部分列的数据时,通过遍历每行数据的方式需要查询出过多的数据。基于行的存储格式,如Avro通过高效的序列化存储数据提供了存储优势。但是,这种优势是以复杂性为代价的。例如,由于结构不够灵活,模式转换将成为挑战。

非结构化数据

相比之下,非结构化数据源是任意格式的文本或不包含标记或元数据的二进制对象(例如以逗号分隔的CSV文件)来组织数据。新闻文章,医疗记录,图像斑点,应用日志经常被当成是非结构化数据。这些数据源分类一般需要根据数据的上下文才能解析。因此,需要清楚知道某个文件是图片还是新闻,才能正确进行解析。大多数数据源都是非结构化的,要从这些非结构化的数据中获取数据价值,由于其格式本身的笨重,需要经过大量转换和特征提取技术去解释这些数据集,成本较高。

半结构化数据

半结构化数据源是每行记录一个结构,但不需要对整体记录有一个全局的模式定义。因此,每行记录是通过其自身的模式信息对其进行扩充。JSON和XML就是其中最流行的例子。半结构化数据的优势在于通过每行记录自身的描述信息,增强了展示数据信息的灵活性。由于有很多轻量级的解析器用于处理这些记录,因此半结构化数据格式在很多应用中普遍被使用,并且在可读性上存在优势。但是,它的主要缺陷也在于会产生额外的解析开销,不能专门应用于即席查询。

用Spark SQL进行数据交换(读和写)

在之前的博文中,我们讨论了如何将Cloudtrail日志从JSON转为为Parquet,以此将即席查询时间缩短10倍。Spark SQL允许用户从批处理和流式查询中获取这些数据源类的数据。它原生的支持在Parquet,ORC,JSON,CSV和文本格式中读取和写入数据,并且Spark还提供了大量其他数据源连接器的包。你可以通过JDBC  DataSource链接SQL数据库。

Apache Spark能够用以下简单的方式来实现数据交换:

events = spark.readStream \

.format("json") \          # or parquet, kafka, orc...

.option() \                # format specific options

.schema(my_schema) \        # required

.load("path/to/data")

output = …                  # perform your transformations

output.writeStream \          # write out your data

.format("parquet") \

.start("path/to/write")

无论是批处理还是流式数据,我们知道怎样读写不同的数据源格式,但是不同的数据源支持不同的模式和数据类型。传统数据库仅仅支持原始数据类型,而像JSON允许用户在列中嵌套对象,有数组类型和键值对类型。用户经常需要擦除这些数据类型,以此达到高效存储和正确表示他们的数据。幸运的是,Spark SQL在处理原始类型和复杂数据类型方面非常容易。让我们看下如何从负责的数据烈性到原始数据类型,反之亦然。

转换复杂数据类型