【问题标题】:Uploading custom schema from a csv file using pyspark使用 pyspark 从 csv 文件上传自定义架构
【发布时间】:2021-07-15 15:59:58
【问题描述】:

我有一个关于使用 pyspark 将架构加载到 cdsw 的查询。 我有一个使用 csv 文件创建的数据框

data_1 = spark.read.csv("demo.csv",sep = ",", header = True, inferSchema = True)

大多数变量的数据类型读取错误,即其中大约 60 个,我不能一直手动更改它们。我知道架构必须是什么样子。

有什么办法,我也可以从 csv 文件加载架构吗?就像它可以读取数据集并覆盖我正在上传的架构一样。

【问题讨论】:

    标签: python-3.x apache-spark pyspark apache-spark-sql schema


    【解决方案1】:

    使用自定义架构读取,以便您可以定义您想要的确切数据类型。

            schema = StructType([ \
                StructField("COl1",StringType(),True), \
                StructField("COL2",DecimalType(20,10),True), \
                StructField("COL3",DecimalType(20,10),True)
            ])
    
            df = spark.read.schema(schema).csv(file_path)
    

    【讨论】:

    • 我有 100 个变量,不能一一指定。我有一个 csv 文件,其中有一个属性名称和数据类型的列表......如何在读取文件时加载它
    • 您必须读取其他 csv 文件并以编程方式将其转换为模式,并将该变量作为模式传递。
    • Variable data_type V1 double V2 String V3 Double V4 Integer..这是我的模式文件的一个例子。当我传递此信息时,获取垃圾值。你能给我提供正确的方法吗? code :/** 读取 Schema **/ sch_df = spark.read.option("header", "true").csv("schema.xlsx").schema /**传递模式 **/ df = spark.read .schema(sch_df).option("header", "true").csv("sample.csv")
    • stackoverflow.com/questions/36026070/… 。您将不得不实施与此类似的事情。读取架构文件并应用转换,然后使用该架构读取您的原​​始数据。
    【解决方案2】:

    您可以加载schema.csv 并以编程方式构建实际架构,然后使用它来加载实际数据。

    注意事项schema.csv 中的类型必须与 Spark datatypes 匹配

    import pandas as pd
    from pyspark.sql.types import *
    
    # schema.csv
    # variable,data_type
    # V1,Double
    # V2,String
    # V3,Double
    # V4,Integer
    
    # data.csv
    # V1,V2,V3,V4
    # 1.2,a,3.4,5
    
    dtypes = pd.read_csv('schema.csv').to_records(index=False).tolist()
    fields = [T.StructField(dtype[0], globals()[f'{dtype[1]}Type']()) for dtype in dtypes]
    schema = StructType(fields)
    
    df = spark.read.csv('data.csv', header=True, schema=schema)
    
    df.printSchema()
    # root
    #  |-- V1: double (nullable = true)
    #  |-- V2: string (nullable = true)
    #  |-- V3: double (nullable = true)
    #  |-- V4: integer (nullable = true)
    
    df.show()
    # +---+---+---+---+
    # | V1| V2| V3| V4|
    # +---+---+---+---+
    # |1.2|  a|3.4|  5|
    # +---+---+---+---+
    

    【讨论】:

      猜你喜欢
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多