如何使用spark从.sql转储中提取包含数据的表?

iszxjhcz  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(272)

我有大约四个*.sql自包含转储(每个大约20gb),需要在apachespark中将它们转换为数据集。
我尝试过使用innodb安装和制作本地数据库,并导入转储文件,但这似乎太慢了(花了大约10个小时)
我直接把文件读入spark

import org.apache.spark.sql.SparkSession

var sparkSession = SparkSession.builder().appName("sparkSession").getOrCreate()
var myQueryFile = sc.textFile("C:/Users/some_db.sql")

//Convert this to indexed dataframe so you can parse multiple line create / data statements. 
//This will also show you the structure of the sql dump for your usecase.

var myQueryFileDF = myQueryFile.toDF.withColumn("index",monotonically_increasing_id()).withColumnRenamed("value","text") 

// Identify all tables and data in the sql dump along with their indexes

var tableStructures = myQueryFileDF.filter(col("text").contains("CREATE TABLE"))
var tableStructureEnds = myQueryFileDF.filter(col("text").contains(") ENGINE"))

println(" If there is a count mismatch between these values choose different substring "+ tableStructures.count()+ " " + tableStructureEnds.count())

var tableData = myQueryFileDF.filter(col("text").contains("INSERT INTO "))

问题是转储也包含多个表,每个表都需要成为一个数据集。我需要弄清楚我们是否能为一张table做。有没有为scala spark编写的.sql解析器?
有没有更快的办法?我可以从.sql自包含文件直接将其读入配置单元吗?
更新1:我正在根据ajay提供的输入编写解析器
更新2:将所有内容更改为基于数据集的代码,以便按照建议使用sql解析器

y4ekin9u

y4ekin9u1#

有没有为scala spark编写的.sql解析器?
是的,有一个,你好像已经在用了。这就是sparksql本身!惊讶吗?
sql解析器接口( ParserInterface )可以从sql语句的文本表示形式创建关系实体。差不多就是你的案子了,不是吗?
请注意 ParserInterface 一次处理一条sql语句,因此您必须以某种方式解析整个转储并找到表定义和行。
这个 ParserInterface 可用作 sqlParserSessionState .

scala> :type spark
org.apache.spark.sql.SparkSession

scala> :type spark.sessionState.sqlParser
org.apache.spark.sql.catalyst.parser.ParserInterface

sparksql附带了几种方法,它们提供了接口的入口点,例如。 SparkSession.sql , Dataset.selectExpr 或者只是 expr 标准功能。也可以直接使用sql解析器。
不知羞耻的插件你可能想读一下parserinterface — 《掌握sparksql》一书中的sql解析器契约。

vhmi4jdf

vhmi4jdf2#

你需要自己解析。它需要以下步骤-
为每个表创建一个类。
使用textfile加载文件。
过滤掉除insert语句以外的所有语句。
然后根据insert语句中的表名,使用filter将rdd拆分为多个rdd。
对于每个rdd,使用map解析insert语句中的值并创建对象。
现在将RDD转换为数据集。

相关问题