@jkgeyti Существует диалект SQLAlchemy Hive, который может быть полезен для вас.
ы соображения безопасности при приеме и выполнении произвольных искровых SQL-запросов?
Представьте себе следующую настройку:
Два файла на hdfs зарегистрированы как таблицыa_secrets
а такжеb_secrets
:
# must only be accessed by clients with access to all of customer a' data
spark.read.csv("/customer_a/secrets.csv").createTempView("a_secrets")
# must only be accessed by clients with access to all of customer b's data
spark.read.csv("/customer_b/secrets.csv").createTempView("b_secrets")
Эти два представления я могу защитить, используя простые права доступа к файлу hdfs. Но скажем, у меня есть следующие логические представления этих таблиц, которые я хотел бы представить:
# only access for clients with access to customer a's account no 1
spark.sql("SELECT * FROM a_secrets WHERE account = 1").createTempView("a1_secrets")
# only access for clients with access to customer a's account no 2
spark.sql("SELECT * FROM a_secrets WHERE account = 2").createTempView("a2_secrets")
# only access for clients with access to customer b's account no 1
spark.sql("SELECT * FROM b_secrets WHERE account = 1").createTempView("b1_secrets")
# only access for clients with access to customer b's account no 2
spark.sql("SELECT * FROM b_secrets WHERE account = 2").createTempView("b2_secrets")
Теперь предположим, что я получаю произвольное(user, pass, query)
задавать. Я получаю список учетных записей, к которым пользователь может получить доступ:
groups = get_groups(user, pass)
и извлеките логический план запроса из запроса пользователя:
spark.sql(query).explain(true)
давая мне план запроса в соответствии с (этот точный план запроса составлен)
== Analyzed Logical Plan ==
account: int, ... more fields
Project [account#0 ... more fields]
+- SubqueryAlias a1_secrets
+- Relation [... more fields]
+- Join Inner, (some_col#0 = another_col#67)
:- SubqueryAlias a2_secrets
: +- Relation[... more fields] csv
== Physical Plan ==
... InputPaths: hdfs:/customer_a/secrets.csv ...
Предполагая, что я могу проанализировать логический план запроса, чтобы точно определить, к каким таблицам и файлам осуществляется доступ, безопасно ли предоставлять доступ к данным, созданным запросом? Я думаю о потенциальных проблемах, таких как:
Существуют ли способы доступа к зарегистрированным таблицам без их отображения в логическом плане запроса?Есть ли способы загрузить новые данные и зарегистрировать их в виде таблиц через чистый искровой SQL? (вход вspark.sql(1)
)?Имеют ли пользователи доступ к каким-либо функциям sql с побочными эффектами (которые изменяют или получают доступ к неаторизованным данным)?Есть ли способы зарегистрировать UDF / выполнить произвольный код чисто черезspark.sql(1)
?Подводя итог: Могу ли я безопасно принять произвольный SQL, зарегистрируйте его сdf = spark.sql(1)
, проанализируйте доступ к данным, используяdf.explain(True)
и затем вернуть результаты, например, с помощьюdf.collect()
?
Редактирование: - 23 января 15:29: отредактировано, чтобы включить префикс "EXPLAIN" в