我们有一个进程会将spark sql写入文件,这个进程会在生产环境中生成数千个spark sql文件。 这些文件将在 ADLS Gen2 目录中创建。
背景:此过程用于生成 PIG 脚本,并使用 MapReduce(MR)作业来读取这些脚本。此 MR 作业使用 PigServer API 将 Pig 脚本提交到 HDInsight 群集。我们正在从 HDInsight 迁移到 Databricks,并尝试使用 Databricks 实现相同的目标。
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
val 2023_I = spark.sql("select rm.* from reu_master rm where rm.year = 2023 and rm.system_part='I'")
val criteria1_r1 = 2023_I.filter($"field_id"==="abcned" or $"field_id"==="gei")
criteria1_r1.write.mode("overwrite").save(<path_t_adls_dir>)
我们正在探索从 Azure Databricks 调用这些文件的最佳方法。我们希望避免通过 Python 将文件读取到变量并在 Spark sql 语句中使用该变量。
最好的方法取决于您的资源,根据处理这些问题的经验,我想到了两种方法。为了避免通过 python 将文件读取到变量并在 Spark sql 语句中使用该变量,您可以使用:
程序简单,减少开销。 示例如下: A。您必须将 Spark SQL 脚本存储在 ADLS Gen2 上的单独文件中,并假设您使用的是 Databricks Notebook。 b.在 Databricks Notebook 中,您将使用 %sql 命令直接从文件执行 SQL 脚本。您可以通过创建临时视图来引用 ADLS Gen2 路径中的文件。创建临时视图的示例代码:
%sql
CREATE OR REPLACE TEMPORARY VIEW my_temp_view AS
SELECT * FROM parquet.`<path_to_adls_gen2_file>`
c.创建视图后,您可以对其运行 Spark SQL 查询。使用 magic 命令,您的代码将如下所示:
%sql
SELECT * FROM my_temp_view WHERE field_id = 'abcned' OR field_id = 'gei'
如果您的 Databricks 集群具有访问 ADLS Gen2 存储和读取 SQL 脚本文件的必要权限,那么您应该没问题。另外,根据您的特定用例和文件位置的需要调整 SQL 脚本和命令。
我的第二个选择是避免通过 python 将文件读取到变量并在 Spark sql 语句中使用该变量。