在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不会将string转换为date type
。
我们需要使用datetime
模块来定义我们的输入数据,然后在使用schema spark进行读取时创建col4
到datetype。
Example:
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|
#+----+----+-----+----------+