Python 在pyspark中创建数据帧后,如何重命名所有列,根据模式转换数据类型/从csv文件读取

Python 在pyspark中创建数据帧后,如何重命名所有列,根据模式转换数据类型/从csv文件读取,python,pyspark,Python,Pyspark,在pyspark中创建了示例数据帧 from pyspark.sql.types import * from pyspark.sql.types import StructField from pyspark.sql import types testdata = [("aaaa",1,50.0,"05-APR-2020"), ("bbbb",2,100.0,"06-APR-2020")] dataschema = types.Stru

在pyspark中创建了示例数据帧

   from pyspark.sql.types import *
   from pyspark.sql.types import StructField
   from pyspark.sql import types
   testdata = [("aaaa",1,50.0,"05-APR-2020"),
               ("bbbb",2,100.0,"06-APR-2020")]
   dataschema = types.StructType([
        types.StructField('col1', types.StringType(), True),
        types.StructField('col2', types.IntegerType(), True),
        types.StructField('col3', types.DoubleType(), True),
        types.StructField('col4', types.DateType(), True)
    ])
   testdf2 = spark.createDataFrame(
          spark.sparkContext.parallelize(testdata),
          dataschema
          )
   testdf2.printSchema()
   testdf2.show()
获取以下错误

TypeError:字段col4:DateType无法接受类型中的对象“05-APR-2020”

如果我有一个包含两列的列表,一个是新列,另一个是数据类型。
如何根据列表或csv/json文件重命名所有列并转换每列的数据类型

默认情况下,Spark不会将字符串转换为
日期类型

我们需要使用
datetime
模块定义输入数据,然后在使用schema spark读取时创建
col4
到datetype

示例:

import datetime
from pyspark.sql.types import *
from pyspark.sql.types import StructField
from pyspark.sql import types
testdata = [("aaaa",1,50.0,datetime.datetime.strptime('05-APR-2020','%d-%b-%Y')),
            ("bbbb",2,100.0,datetime.datetime.strptime('06-APR-2020','%d-%b-%Y'))]

dataschema = types.StructType([
        types.StructField('col1', types.StringType(), True),
        types.StructField('col2', types.IntegerType(), True),
        types.StructField('col3', types.DoubleType(), True),
        types.StructField('col4', types.DateType(), True)
    ])

testdf2 = spark.createDataFrame(
          spark.sparkContext.parallelize(testdata),
          dataschema
          )
testdf2.printSchema()
#root
# |-- col1: string (nullable = true)
# |-- col2: integer (nullable = true)
# |-- col3: double (nullable = true)
# |-- col4: date (nullable = true)


testdf2.show()
#+----+----+-----+----------+
#|col1|col2| col3|      col4|
#+----+----+-----+----------+
#|aaaa|   1| 50.0|2020-04-05|
#|bbbb|   2|100.0|2020-04-06|
#+----+----+-----+----------+

另一种方法是为
col4
定义
stringtype
,然后使用
to_date
函数转换为
date

dataschema = types.StructType([
        types.StructField('col1', types.StringType(), True),
        types.StructField('col2', types.IntegerType(), True),
        types.StructField('col3', types.DoubleType(), True),
        types.StructField('col4', types.StringType(), True)
    ])

testdata = [("aaaa",1,50.0,"05-APR-2020"),
               ("bbbb",2,100.0,"06-APR-2020")]

spark.createDataFrame(testdata,dataschema).withColumn("col4",to_date(col("col4"),"dd-MMM-yyyy")).printSchema()
#root
# |-- col1: string (nullable = true)
# |-- col2: integer (nullable = true)
# |-- col3: double (nullable = true)
# |-- col4: date (nullable = true)

spark.createDataFrame(testdata,dataschema).withColumn("col4",to_date(col("col4"),"dd-MMM-yyyy")).show()
#+----+----+-----+----------+
#|col1|col2| col3|      col4|
#+----+----+-----+----------+
#|aaaa|   1| 50.0|2020-04-05|
#|bbbb|   2|100.0|2020-04-06|
#+----+----+-----+----------+

谢谢这很好用。我有来自csv/json文件的元数据,其中包含列、数据类型和日期/时间戳(格式)所需的任何转换逻辑。我们可以用文件中的列创建dataframe并动态应用强制转换吗。