Databricks JDBC 与 Pyspark 返回行所有行作为列名称

问题描述 投票:0回答:1

我正在尝试从 Azure DataBricks 访问和查询,但我一直将所有行作为列名称。 我正在遵循代码方法。 如果有人知道这一点,请给出解决方案。

df = spark.read.format("jdbc")
.option("url", "jdbc:databricks://<WorkspaceInstance>... <Token>")
.option("query", "query")
.option("user", "username")
.option("password", token)
.option("fetchsize", "10")
.option("driver", "com.databricks.client.jdbc.Driver")
.load()

df.show()

+-------+-------
|CustomerName  |
+-------+-------
|CustomerName  |
|CustomerName  |
|CustomerName  |
+-------+-------
python apache-spark jdbc databricks azure-databricks
1个回答
0
投票

确保您在 SQL 查询中引用的列名称与表中的列名称完全匹配。 如果任何列包含空格或特殊字符,请用 反引号 (`) 将其括起来,以避免出现任何问题。

我尝试了下面的示例并从 Azure SQL 读取数据:

连接到 Azure SQL 数据库:

from pyspark.sql import SparkSession
from pyspark.sql.types import StructType, StructField, IntegerType, StringType, DateType
jdbcHostname = "dilipserver.database.windows.net"
jdbcPort = 1433
jdbcDatabase = "db02"
jdbcUrl = f"jdbc:sqlserver://{jdbcHostname}:{jdbcPort};database={jdbcDatabase}"

connectionProperties = {
    "user": "dilip",
    "password": "Welcome@1"
}


custom_schema = StructType([
    StructField("RequestID", IntegerType(), True),
    StructField("CustomerName", StringType(), True),
    StructField("RequestType", StringType(), True),
    StructField("RequestDate", DateType(), True),
    StructField("Status", StringType(), True)
])
sqlQuery = "SELECT * FROM repair_request"
df = spark.read.format("jdbc") \
    .option("url", jdbcUrl) \
    .option("dbtable", f"({sqlQuery}) AS repair_request_alias") \
    .option("user", connectionProperties["user"]) \
    .option("password", connectionProperties["password"]) \
    .option("fetchsize", "10") \
    .option("driver", "com.microsoft.sqlserver.jdbc.SQLServerDriver") \
    .option("header", "true")\
    .schema(custom_schema) \
    .load()
df.show()
+---------+------------+-----------+-----------+-----------+
|RequestID|CustomerName|RequestType|RequestDate|     Status|
+---------+------------+-----------+-----------+-----------+
|        1|    John Doe| Electrical| 2023-01-10|    Pending|
|        2|  Jane Smith|   Plumbing| 2023-02-15|In Progress|
|        3| Bob Johnson|       HVAC| 2023-03-20|  Completed|
+---------+------------+-----------+-----------+-----------+

在上面的代码中,我明确定义了一个自定义架构

(custom_schema)
,这确保了 Spark 不会从数据的第一行推断列名称。

读取数据时指定customSchema选项。 该选项允许您指定查询返回的数据的模式,这可以帮助 JDBC 驱动程序正确解析数据。

.option("header", "true")
表示数据的第一行包含列标题。

© www.soinside.com 2019 - 2024. All rights reserved.