spark下使用pyspark讀取csv文件

直接讀取

    ss = SparkSession \
        .builder \
        .appName("luodj_db_access") \
        .getOrCreate()

    # 列名是_c開頭的,例如_c0, _c1,且header也當做一行
    df = ss.read.csv('./mdd_sample.csv')

讀取本地文件,列名是_c開頭的自動列名。
20200316134518.png

但是對應的schema全是string
20200316134603.png

使用自定義結構體讀取

如果想要一開始就轉換成自己想要的格式,可以使用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來過濾
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章