Spark SQL是用于结构化数据处理的Spark模块。与基本的Spark RDD API不同,Spark SQL提供的接口为Spark提供了有关数据结构和正在执行的计算的更多信息。在内部,Spark SQL使用这些额外的信息来执行额外的优化。
与Spark SQL交互的方法有多种,包括SQL和Dataset API。计算结果时,将使用相同的执行引擎,而与要用来表达计算的API /语言无关。
一、SparkSession
SparkSession类是Spark中所有功能的入口点。要创建一个基本的SparkSession,只需使用SparkSession.builder()创建。
SparkSession spark = SparkSession.builder().appName("Spark SQL").master("local[4]").getOrCreate();
二、Dataset
Dataset是数据的分布式集合。数据集是Spark 1.6中添加的新接口,它具有RDD的优点(强类型输入,使用强大的lambda函数的能力)以及Spark SQL的优化执行引擎的优点。Dataset可以被构造从JVM对象,然后使用功能性的转换(操作map,flatMap,filter等等)。
Dataset API在Scala和 Java中可用。Python不支持Dataset API。但是由于Python的动态特性,Dataset API的许多优点已经可用(即,您可以自然地通过名称访问行的字段 row.columnName)。R的情况与此类似。
DataFrame是数据格式为Row的Dataset。从概念上讲,它等效于关系数据库中的表或R / Python中的数据框,但是在后台进行了更丰富的优化。可以从多种来源构造DataFrame,例如:结构化数据文件,Hive中的表,外部数据库或现有的RDD。DataFrame API在Scala,Java,Python和R中可用。在Scala和Java中,DataFrame由的数据集表示Row。在Scala API中,DataFrame只是类型别名Dataset[Row]。而在Java API中,用户需要使用Dataset<Row>来代表DataFrame。
在整个文档中,我们通常将的Scala / Java的Dataset<Row>称为DataFrames。
Dataset<Row> df = spark.read().json("/test.json");