在spark中将数据插入到hive表
步骤:
1. 创建数据集的sparkdataFrame
这里使用的是TmpDF = spark.createDataFrame(RDD, schema)这种方法创建的
2. 将数据集的dataFrame格式映射到临时表
使用createOrReplaceTempView来创建,这个函数在SQLcontext中
3. 用spark SQL 语句将临时表的数据导入hive的tmp_table表中
如下:
spark.sql("insert into table student2 select * fromtmpV")
我们先来使用spark.sql来看下我们的数据库
我先在Linux中打开hive,查看下该数据仓库中的数据库,发现我们查询的和我们在jupyter中使用spark.sql查询到的内容一样,所以我们在jupyter中创建的数据库和表都是直接作用在hive中的。
选择stduent数据库,并在该数据库中创建一个student2表,并定义其字段及类型,还标明了可以导入文件并以逗号为分隔符分隔开。
我在第二行写了这句spark.sql("desc formattedtb_student").show(),查看了一下该表的结构及详细信息,可以看到该表的字段及location,location后面标注了该表的地址,其映射的是我们的Linux中的hive数据集仓库
为了得到更准确的答案,我在hive中查看了一下stduent数据库,并查看了一下该数据库中的表,发现了我们在jupyter中创建的student2表
因为创建的表是空的,所以我来导入一下本地文件并查询其内容
我先导入from pyspark.sql.types import *,以便下面在定义类型的时候可以进行转换,我自己定义了一个dataFrame类型的df,并将df格式映射到临时表tmpV中,这里和我们之前使用是sparkSQL一样,我们要想使用sql语句来查询表数据的话就必须将一个dataFrame注册成一个临时表。
这里创建的临时表tmpV可以使用spark.sql来查询其中的数据,我们在第一个表中可以看到。
接着我将查询到的tmpV中的内容插入到student2表中去了,再来查看一下student2中的内容,发现和我们预想的一样,这里就成功的把我们的数据插入到hive表中了
在spark中将数据插入到parquet表
首先先创建一个parquet类型的表name_age2
接着定义一个变量strsql,把我们要创建表的SQL语句赋值给该变量,
我们将我们创建好的表查询一下,发现并没有数据,但有我们创建字段
接着我们来插入一下数据,这里的数据是由student2表中查询而来的
当然,我们也可将student2表注册成一个临时表(将数据集的DataFrame格式映射到临时表)这个操作和上面那个操作是分开的,这里默认name_age2表中没有数据
接着来查询一下name_age2表中的数据,和前面那种方法得出的结果一致
案列
来看下这个案列,就是根据一些条件来进行查询
定义用户函数
如果我们想对一些字段进行修改的话,可以自定义一个函数来进行修改,这里要注意两点;
1. from pyspark.sqlimport functions as F
导入pyspark.sql 模块中的functions,并给它取个别名为F
2. 使用registerFunction来将我们定义的函数进行注册,这样就可以在dataFrame SQL中使用这个函数