@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" в

Ответы на вопрос(1)

Ваш ответ на вопрос