直接讀取
ss = SparkSession \
.builder \
.appName("luodj_db_access") \
.getOrCreate()
# 列名是_c開頭的,例如_c0, _c1,且header也當做一行
df = ss.read.csv('./mdd_sample.csv')
讀取本地文件,列名是_c開頭的自動列名。
但是對應的schema全是string
使用自定義結構體讀取
如果想要一開始就轉換成自己想要的格式,可以使用schema來指定自定義的structtype,
# 支持格式
from pyspark.sql.types import StructField, StructType, DateType, StringType, DecimalType, IntegerType, DoubleType
schema1 = StructType([
StructField('pub_dt', StringType(), False),
StructField('sec_id', StringType(), False),
StructField('f0010', StringType(), True),
StructField('f0020', StringType(), True),
StructField('f0030', StringType(), True),
StructField('f0040', StringType(), True),
StructField('f0050', StringType(), True),
StructField('f1010', StringType(), True),
StructField('f1020', StringType(), True),
StructField('f1030', StringType(), True),
StructField('f1040', StringType(), True),
StructField('f1050', StringType(), True),
StructField('f3010', StringType(), True),
StructField('f3020', StringType(), True),
StructField('f3030', DateType(), True),
StructField('f3040', DoubleType(), True),
StructField('f3050', IntegerType(), True),
StructField('rnk', IntegerType(), True),
])
df = ss.read.csv('./mdd2.csv',
header=True,
enforceSchema=True,
sep=',',
mode='FAILFAST',
dateFormat='yyyy/MM/dd',
schema=schema1)
enforceSchema
建議設置,防止使用了使用了自定帶格式導致不一樣的錯誤- schema指定自己structtype,也可以ddl格式,例如"pub_dt Date, sec_id String"
- mode 主要有三個值,分別是
PERMISSIVE
(遇到解析不了,使用系統自帶轉換,實在不行就轉換成null)、DROPMALFORMED
(遇到解析不了,就放棄該記錄)和FAILFAST
(遇到解析不了,就報錯,終止代碼執行) header
是否設置對應忽略第一行,如果第一行是列頭,可以這是true來過濾