我正在尝试从 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 |
+-------+-------
确保您在 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")
表示数据的第一行包含列标题。