Python TypeError:TimestampType无法接受对象<;类别';str'&燃气轮机;及<;类别';int'&燃气轮机;
我有一个熊猫数据帧,我正在HDFS中写入一个表。当Python TypeError:TimestampType无法接受对象<;类别';str'&燃气轮机;及<;类别';int'&燃气轮机;,python,pandas,pyspark,apache-spark-sql,Python,Pandas,Pyspark,Apache Spark Sql,我有一个熊猫数据帧,我正在HDFS中写入一个表。当Srum\u Entry\u Creation是StringType()时,我可以将数据写入表中,但我需要它是TimestampType()。这就是我遇到的TypeError:TimestampType不能接受type中的对象“2019-05-20 12:03:00”或TypeError:TimestampType不能接受type中的对象155835378000000000。在定义模式之前,我曾尝试用python将列转换为不同的日期格式,但似乎可
Srum\u Entry\u Creation
是StringType()
时,我可以将数据写入表中,但我需要它是TimestampType()
。这就是我遇到的TypeError:TimestampType不能接受type
中的对象“2019-05-20 12:03:00”或TypeError:TimestampType不能接受type
中的对象155835378000000000。在定义模式之前,我曾尝试用python将列转换为不同的日期格式,但似乎可以让导入正常工作
df
Srum_Entry_ID Connected_Time Machine Srum_Entry_Creation
0 5769.0 0.018218 Computer1 2019-05-20 12:03:00
1 5770.0 0.000359 Computer1 2019-05-20 12:03:00
2 5771.0 0.042674 Computer2 2019-05-20 13:03:00
3 5772.0 0.043229 Computer2 2019-05-20 14:04:00
4 5773.0 0.032222 Computer3 2019-05-20 14:04:00
spark = SparkSession.builder.appName('application').getOrCreate()
schema = StructType([StructField('Srum_Entry_ID', FloatType(), False),
StructField('Connected_Time', FloatType(), True),
StructField('Machine', StringType(), True),
StructField('Srum_Entry_Creation', TimestampType(), True)])
dataframe = spark.createDataFrame(df, schema)
dataframe.write. \
mode("append"). \
option("path", "/user/hive/warehouse/analytics.db/srum_network_connections"). \
saveAsTable("analytics.srum_network_connections")
我试过:
df['Srum_Entry_Creation'] = df['Srum_Entry_Creation'].astype('datetime64[ns]')
错误:
TypeError:TimestampType无法接受类型中的对象155835378000000000
和
df['Srum_Entry_Creation'] = pd.to_datetime(df['Srum_Entry_Creation'])
错误:
TypeError:TimestampType无法接受类型中的对象155835378000000000
和如果我只是将其作为字符串保留在pandas数据帧中,我会得到:
错误:
TypeError:TimestampType无法接受类型中的对象“2019-05-20 12:03:00”
简而言之,我将日期时间转换为历元时间
df['epoch'] = (df['New_Srum_Entry_Creation'] - dt.datetime(1970,1,1)).dt.total_seconds()
df['epoch'] = df['epoch'].astype('Int64')
然后对架构使用IntegerType()
StructField('epoch', IntegerType(),True)
你试过用日期时间格式替换它吗?我试过df['Srum_Entry_Creation']=df['Srum_Entry_Creation'].astype('datetime64[ns]')和df['Srum_Entry_Creation']=pd.to_datetime(df['Srum_Entry_Creation']),错误是什么?相同吗?我把它们添加到问题@StevenIs it中作为一个选项,从spark将时间戳导出为字符串,然后再转换?我知道这有点痛,因为这意味着额外的转换,但如果它起作用?!或者可以使用
numpy.datetime64
代替TimestampType()
,因为用作TimestampType
的类似乎无法转换为使用imho的numpy.timestamp64
。