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来过滤
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章