我有大约四个*.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解析器
2条答案
按热度按时间y4ekin9u1#
有没有为scala spark编写的.sql解析器?
是的,有一个,你好像已经在用了。这就是sparksql本身!惊讶吗?
sql解析器接口(
ParserInterface
)可以从sql语句的文本表示形式创建关系实体。差不多就是你的案子了,不是吗?请注意
ParserInterface
一次处理一条sql语句,因此您必须以某种方式解析整个转储并找到表定义和行。这个
ParserInterface
可用作sqlParser
的SessionState
.sparksql附带了几种方法,它们提供了接口的入口点,例如。
SparkSession.sql
,Dataset.selectExpr
或者只是expr
标准功能。也可以直接使用sql解析器。不知羞耻的插件你可能想读一下parserinterface — 《掌握sparksql》一书中的sql解析器契约。
vhmi4jdf2#
你需要自己解析。它需要以下步骤-
为每个表创建一个类。
使用textfile加载文件。
过滤掉除insert语句以外的所有语句。
然后根据insert语句中的表名,使用filter将rdd拆分为多个rdd。
对于每个rdd,使用map解析insert语句中的值并创建对象。
现在将RDD转换为数据集。