如何在PySpark中基于传入的字符串格式日期创建DataFrame?
在PySpark中基于字符串格式日期创建DataFrame的方法
嘿,我来帮你搞定这个问题!你已经有了从文本文件构建DataFrame的代码,现在想要直接基于传入的字符串格式日期值来创建DataFrame对吧?下面给你几种实用的方法:
方法1:直接构造数据列表创建(灵活可控)
如果手里有现成的字符串日期数据(比如你test.txt里那种yyyyMMdd格式的20180405),可以直接构造数据列表,再通过指定Schema来创建DataFrame,这种方式清晰又灵活:
from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType, DateType # 初始化SparkSession(如果还没初始化的话) spark = SparkSession.builder.appName("test_date_df").getOrCreate() # 模拟你传入的字符串日期数据,每条记录是(cCode, pCode, 字符串日期) data = [ ("149", "898", "20180405"), ("135", "379", "20180428"), ("135", "381", "20180406"), ("31", "898", "20180429") ] # 定义Schema,明确每个字段的类型 schema = StructType([ StructField("cCode", StringType(), nullable=True), StructField("pCode", StringType(), nullable=True), StructField("mDate", StringType(), nullable=True) # 先以字符串类型存储原始日期 ]) # 创建DataFrame df = spark.createDataFrame(data, schema=schema) df.show()
如果后续需要做日期相关的操作(比如筛选某月的数据、计算日期差),可以用to_date函数把字符串转换成PySpark的DateType,记得一定要指定正确的原始日期格式:
from pyspark.sql.functions import to_date # 将字符串日期转换为日期类型,原始格式是yyyyMMdd df_with_date = df.withColumn("mDate", to_date(df.mDate, "yyyyMMdd")) # 查看转换后的Schema和数据 df_with_date.printSchema() df_with_date.show()
方法2:基于现有代码调整(处理传入的原始字符串)
如果你的输入是类似test.txt里的长字符串(比如用空格分隔每条记录、竖线分隔字段),可以直接对这个字符串做处理,不用读文件:
from pyspark.sql import Row # 模拟你传入的原始字符串内容 input_raw_str = "149|898|20180405 135|379|20180428 135|381|20180406 31|898|20180429 31|245|20180430" # 处理字符串并创建DataFrame df_transac = spark.createDataFrame( spark.sparkContext.parallelize(input_raw_str.split(" ")) # 按空格拆分每条记录 .map(lambda x: x.split("|")[:3]) # 按竖线拆分字段 .map(lambda r: Row(cCode=r[0], pCode=r[1], mDate=r[2])) ) # 同样可以转换日期类型 df_transac = df_transac.withColumn("mDate", to_date(df_transac.mDate, "yyyyMMdd")) df_transac.show()
小提示
- 如果只是需要存储日期字符串,用
StringType就足够;如果要做日期计算、筛选等操作,转换成DateType能让PySpark提供更多日期相关的函数支持。 - 用
to_date时,格式参数一定要和你的原始字符串日期匹配,比如yyyyMMdd对应20180405,yyyy-MM-dd对应2018-04-05,格式不对会导致解析失败返回null哦。
内容的提问来源于stack exchange,提问作者Sai
相关产品推荐
相关产品推荐

