我正在尝试使用上述方法解决spark sql小文件问题,例如在我的组织中用户传入sql语句。
insert overwrite table x partition (column1) select * from y;
我可以在spark sql中运行上面的sql问题是它与hive相比创建了小文件,而hive有(merge small files = true)选项等...它不能在spark sql中工作。
我想出了一个解决方法,就像拿用户sql语句并分成两个部分select子句和insert子句,从select子句创建Dataframe首先得到估计大小并计算输出文件并插入到目标表下面就是例子val df=sqlContext.sql(select * from y)
val size=SizeEstimator.estimate(df)
val outputFiles=size/256000
df.coleasce(outputFiles).wirte.mode.Append("x partition (column1)")
Java / Scala中是否有正则表达式函数或库可以将select子句和insert子句与sql字符串分开?
由于
答案 0 :(得分:0)
我会使用以下正则表达式:
(.+?) (?=select)(.+)
第一个捕获组将包含INSERT
语句,第二个捕获组将包含SELECT
语句。当然,建议采用不区分大小写的方法。您可以看到有效的演示here。