PySpark 缺少列名错误,Azure Synapse 分析笔记本中的数字列名

Posted

技术标签:

【中文标题】PySpark 缺少列名错误,Azure Synapse 分析笔记本中的数字列名【英文标题】:PySpark missing column name error with numerical column names in an Azure Synapse analytics notebook 【发布时间】:2021-11-03 08:52:43 【问题描述】:

在使用 Azure Synapse SQL 专用池作为数据源创建数据帧时,我遇到了这个问题。一些列具有数字列名称,例如“240”。我在 scala 中使用了 synapsesql 连接器,然后使用 spark.sql 将数据帧抓取到 pyspark 数据帧。即使我能够毫无问题地打印数据框的架构,尝试选择具有数字名称的任何列也会产生错误。

该错误与对应于带有特殊字符的列名的空别名有关。我无法弄清楚这是火花问题还是与 Synapse 分析数据源有关。

%%spark
val df = spark.read.
option(Constants.SERVER, "db.sql.azuresynapse.net").
synapsesql("DWH.table")
        
df.createOrReplaceTempView("table")

df_p = spark.sql("SELECT * FROM table")
df_p.select('240').show()
df_p.printSchema()

我知道在处理包含非法字符的列名时应该使用反引号,但以下似乎会产生相同的错误

df_p = spark.sql("SELECT * FROM table")
df_p.select('`240`').show()
df_p.printSchema()

产生的错误

Py4JJavaError: An error occurred while calling o204.showString.
: com.microsoft.spark.sqlanalytics.exception.SQLAnalyticsConnectorException: com.microsoft.sqlserver.jdbc.SQLServerException: An object or column name is missing or empty. For SELECT INTO statements, verify each column has a name. For other statements, look for empty alias names. Aliases defined as "" or [] are not allowed. Change the alias to a valid name.

有人可以告诉我为什么会出现错误吗?

谢谢!

【问题讨论】:

【参考方案1】:

读取 API,因为连接当前不支持对工作区外的专用 SQL 池进行基于令牌的身份验证。将需要 SQL 身份验证。

      val df=spark.read.option(Constants.SERVER,"samplews.database.windows.net").
      option(Constants.USER, <SQLServer Login UserName>).
      option(Constants.PASSWORD, <SQLServer Login Password>).
      synapsesql("<DBName>.<Schema>.<TableName>")

使用 PySpark 中的数据框创建一个临时表并使用魔法在 PySpark 笔记本中运行一个 Scala 单元:

pyspark_df.createOrReplaceTempView("temptable")
val scala_df = spark.sqlContext.sql ("select * from pysparkdftemptable")

然后您可以使用select()show() 选择列:

df_p.select("240").show()
df_p.printSchema()

如果您遇到错误会要求您再次运行会话并查看。

因为这在剪辑中有效:

【讨论】:

感谢您的回答!我认为这并不能直接解决问题。我在 PySpark 笔记本中使用 Scala 单元将数据从 SQL 池中读取到数据帧中没有问题。我的数据框也有没有任何特殊字符的列,并且这些列的操作按预期工作。提供的示例在我的笔记本中有效,所以我想这与 spark 在这种情况下如何解释这些特定的列名有关。 感谢您的更新,根据我对问题的理解-您无法选择数字列名,但是关于“spark 如何解释这些特定的特殊列名这种情况。”

以上是关于PySpark 缺少列名错误,Azure Synapse 分析笔记本中的数字列名的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark 自联接错误“缺少已解决的属性”

PySpark AnalysisException:无法解析列名

得到'缺少一个任务。管道引用了一个名为“缓存”的任务。 Azure 管道中的错误

加载多个文件并且缺少一个文件时,PySpark 作业失败 [重复]

如何使用 Azure 存储目录作为流数据源执行 PySpark Stream

由于 PySpark 时间戳,将 Spark 数据帧保存到 Azure Synapse 时出现问题