Pyspark 没有获取自定义架构

Pyspark Not Picking Up Custom Schema

我正在测试这段代码。

from  pyspark.sql.functions import input_file_name
from pyspark.sql import SQLContext
from pyspark.sql.types import *
sqlContext = SQLContext(sc)


customSchema = StructType([ \
StructField("id", StringType(), True), \
StructField("date", StringType(), True), \
etc., etc., etc.
StructField("filename", StringType(), True)])



fullPath = "path_and_credentials_here"
df = sqlContext.read.format('com.databricks.spark.csv').options(header='false', schema = customSchema, delimiter='|').load(fullPath).withColumn("filename",input_file_name())

df.show()

现在,我的数据是竖线分隔的,第一行有一些元数据,也是竖线分隔的。奇怪的是自定义模式实际上被忽略了。文件第一行中的元数据没有应用我的自定义模式,而是控制着模式,这是完全错误的。这是我看到的景色。

+------------------+----------+------------+---------+--------------------+
|               _c0|       _c1|         _c2|      _c3|            filename|
+------------------+----------+------------+---------+--------------------+
|                CP|  20190628|    22:41:58|   001586|   abfss://rawdat...|
|          asset_id|price_date|price_source|bid_value|   abfss://rawdat...|
|             2e58f|  20190628|         CPN|  108.375|   abfss://rawdat...|
|             2e58f|  20190628|         FNR|     null|   abfss://rawdat...|

etc., etc., etc.

如何应用自定义架构?

您遇到的问题是因为您使用的是较旧的(不再维护的)CSV reader。请参阅标题 of the package.

下方的免责声明

如果您尝试新格式,它会起作用:

In [33]: !cat /tmp/data.csv
CP|12|12:13
a|b|c
10|12|13

In [34]: spark.read.csv(fullPath, header='false', schema = customSchema, sep='|').show()
+----+---+-----+
|name|foo|  bar|
+----+---+-----+
|  CP| 12|12:13|
|   a|  b|    c|
|  10| 12|   13|
+----+---+-----+