来自 pandas 系列的 Spark DataFrame
Posted
技术标签:
【中文标题】来自 pandas 系列的 Spark DataFrame【英文标题】:Spark DataFrame from pandas Series 【发布时间】:2017-11-13 12:19:10 【问题描述】:我有一个熊猫系列对象
dates = pd.Series(pd.date_range(start_date,end_date))/
.dt.strftime('%y%m%d')/
.astype(int)/
我想直接从 Series 对象创建 Spark DF,无需中间 Pandas 数据框
_schema = StructType([
StructField("date_id", IntegerType(), True),
])
dates_rdd = sc.parallelize(dates)
self.date_table = spark.createDataFrame(dates_rdd, _schema)
错误:
Error: raise TypeError("StructType can not accept object %r in type %s" %
(obj, type(obj)))
TypeError: StructType can not accept object 160101 in type <class
'numpy.int64'>
如果我将 Series 对象更改为:
dates = pd.Series(pd.date_range(start_date,end_date))/
.dt.strftime('%y%m%d')/
.astype(int).values.tolist()
错误变成:
raise TypeError("StructType can not accept object %r in type %s" % (obj,
type(obj)))
TypeError: StructType can not accept object 160101 in type <class 'int'>
如何正确地将日期列表/rdd 中包含的 Int 值映射到 Spark Dataframes 接受的 Python 本机整数?
【问题讨论】:
@Suresh 还是一样的错误 start_date,end_date 值好吗? 【参考方案1】:这将起作用:
dates_rdd = sc.parallelize(dates).map(lambda x: tuple([int(x)]))
date_table = spark.createDataFrame(dates_rdd, _schema)
在定义dates_rdd
时附加map的目的是为了让rdd的格式匹配schema
【讨论】:
ok 基本上和下面的答案一样,比我快 20 秒 ;) 是的,基本上他之前已经发表了评论,所以我相信接受他的回答是公平的【参考方案2】:相信,你错过了为每个系列值创建一个元组,
>>> dates = pd.Series(pd.date_range(start='1/1/1980', end='1/11/1980')).dt.strftime('%y%m%d').astype(int).values.tolist()
>>> rdd = sc.parallelize(dates).map(lambda x:(x,))
>>> _schema = StructType([StructField("date_id", IntegerType(), True),])
>>> df = spark.createDataFrame(rdd,schema=_schema)
>>> df.show()
+-------+
|date_id|
+-------+
| 800101|
| 800102|
| 800103|
| 800104|
| 800105|
| 800106|
| 800107|
| 800108|
| 800109|
| 800110|
| 800111|
+-------+
>>> df.printSchema()
root
|-- date_id: integer (nullable = true)
【讨论】:
以上是关于来自 pandas 系列的 Spark DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Spark 数据帧转换为 Pandas 并返回 Kedro?