我尝试构建一个使用Spark执行注入安全动态SQL查询的中间件,使用Cassandra作为存储引擎.执行查询的结果需要存储在新创建的Cassandra表中.
Spark SQL没有为安全参数绑定提供任何功能,所以我考虑使用JDBC thrift服务器和JDBC接口.
通过运行来执行从Hive将数据插入外部表
CREATE EXTERNAL TABLE <table_name>... STORED BY...
Run Code Online (Sandbox Code Playgroud)
但是,当尝试通过thrift服务器执行此语句时,我总是会收到以下错误:
java.sql.SQLException: org.apache.spark.sql.catalyst.parser.ParseException:
Operation not allowed: STORED BY(line 1, pos 31)
Run Code Online (Sandbox Code Playgroud)
经过一些网络挖掘后,我发现原因是thrift服务器正在使用Spark SQL,并且在Spark SQL上默认禁用了Hive支持.然后,通常的建议是手动创建SparkSession并使用enableHiveSupport().
问题是我不想这样做,因为我无法使用Spark SQL进行安全的参数绑定.我只想使用JDBC接口.你知道是否有办法在thrift服务器启动时启用Hive支持?
如果没有办法,有人可以推荐一种安全的参数绑定方式吗?
我正在使用Spark 2.1.0
实际上我也无法使用手动创建的SparkSession通过SparkSQL创建外部表,即使是使用enableHiveSupport().仍然得到相同的例外:
org.apache.spark.sql.catalyst.parser.ParseException: 
Operation not allowed: STORED BY(line 1, pos 42)
Run Code Online (Sandbox Code Playgroud)