将熊猫数据帧转换为火花数据帧时收到错误

Posted

技术标签:

【中文标题】将熊猫数据帧转换为火花数据帧时收到错误【英文标题】:error received when convert a pandas dataframe to spark dataframe 【发布时间】:2016-01-15 04:29:51 【问题描述】:

由于没有开箱即用的支持在 spark 中读取 excel 文件,所以我首先将 excel 文件读入 pandas 数据帧,然后尝试将 pandas 数据帧转换为 spark 数据帧,但出现以下错误 (我使用的是火花 1.5.1)

import pandas as pd
from pandas import ExcelFile
from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql.types import *

pdf=pd.read_excel('/home/testdata/test.xlsx')
df = sqlContext.createDataFrame(pdf)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/spark/spark-hadoop/python/pyspark/sql/context.py", line 406, in createDataFrame
    rdd, schema = self._createFromLocal(data, schema)
  File "/opt/spark/spark-hadoop/python/pyspark/sql/context.py", line 337, in _createFromLocal
    data = [schema.toInternal(row) for row in data]
  File "/opt/spark/spark-hadoop/python/pyspark/sql/types.py", line 541, in toInternal
    return tuple(f.toInternal(v) for f, v in zip(self.fields, obj))
  File "/opt/spark/spark-hadoop/python/pyspark/sql/types.py", line 541, in <genexpr>
    return tuple(f.toInternal(v) for f, v in zip(self.fields, obj))
  File "/opt/spark/spark-hadoop/python/pyspark/sql/types.py", line 435, in toInternal
    return self.dataType.toInternal(obj)
  File "/opt/spark/spark-hadoop/python/pyspark/sql/types.py", line 191, in toInternal
    else time.mktime(dt.timetuple()))
AttributeError: 'datetime.time' object has no attribute 'timetuple'

有人知道怎么解决吗?

【问题讨论】:

你能发一个链接到你的test.xlsx吗? drive.google.com/file/d/0B9n_aOz2bmxzVUc2S084dW1KR1E/… 【参考方案1】:

我最好的猜测是,当您使用 Pandas 读取数据时“错误地”解析 datetime 数据

以下代码“正常工作”:

import pandas as pd
from pandas import ExcelFile
from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql.types import *

pdf = pd.read_excel('test.xlsx', parse_dates=['Created on','Confirmation time'])

sc = SparkContext()
sqlContext = SQLContext(sc)

sqlContext.createDataFrame(data=pdf).collect()

[Row(Customer=1000935702, Country='TW',  ...

请注意,您还有一个日期时间列 'Confirmation date',在您的示例中由 NaT 组成,因此使用您的短样本读取 RDD 没有问题,但是如果您碰巧在完整数据集中有一些数据您还必须注意该列。

【讨论】:

之前的错误消失了,但是我得到了一个类型错误。想知道我是否需要专门解决每种列类型?谢谢 >>> df = sqlContext.createDataFrame(pdf) Traceback(最近一次调用最后):文件“”,第 1 行,在 文件“/opt/spark/spark-hadoop/python/pyspark/ sql/context.py”,第 406 行,在 createDataFrame rdd,schema = self._createFromLocal(data, schema) 文件“/opt/spark/spark-hadoop/python/pyspark/sql/context.py”,第 322 行,在_createFromLocal ... TypeError:无法合并类型 @b4me 您可能会考虑接受之前问题的解决方案并将新问题作为新问题发布....

以上是关于将熊猫数据帧转换为火花数据帧时收到错误的主要内容,如果未能解决你的问题,请参考以下文章

将火花数据帧写入镶木地板格式时出现内存不足错误

读取包含来自csv的单元格中的字典的熊猫数据框

使用 pyspark 将 RDD 行转换为数据帧时出错

当我们尝试将巨大的 Pandas 数据帧(40-50 百万行)转换为 Spark 2.0 数据帧时如何提高性能

无法将 aws 胶水动态帧转换为火花数据帧

如何将火花数据帧数组转换为元组