Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark &引用;startPos和length必须为同一类型;尝试在数据帧中添加列时出错_Apache Spark_Pyspark_Datetime Format_Calculated Columns_Azure Databricks - Fatal编程技术网

Apache spark &引用;startPos和length必须为同一类型;尝试在数据帧中添加列时出错

Apache spark &引用;startPos和length必须为同一类型;尝试在数据帧中添加列时出错,apache-spark,pyspark,datetime-format,calculated-columns,azure-databricks,Apache Spark,Pyspark,Datetime Format,Calculated Columns,Azure Databricks,我有一个.csv文件,我正试图使用Python用Azure Databricks修改它 该文件有两列timeOfMeasurement,格式为2021-01-04T07:07:45.098+0000和eventprocesseduttime,格式为2021-01-04T07:07:45.6768856Z。我想添加新的列,其中这些字符串的格式为datetime 当我使用单个变量时,以下格式有效: import datetime # EventProcessedUtcTime a = '2021-

我有一个.csv文件,我正试图使用Python用Azure Databricks修改它

该文件有两列
timeOfMeasurement
,格式为
2021-01-04T07:07:45.098+0000
eventprocesseduttime
,格式为
2021-01-04T07:07:45.6768856Z
。我想添加新的列,其中这些字符串的格式为datetime

当我使用单个变量时,以下格式有效:

import datetime

# EventProcessedUtcTime
a = '2021-01-04T07:07:45.6768856Z'
x = datetime.datetime.strptime((a[:26]).strip(), '%Y-%m-%dT%H:%M:%S.%f')
print(x)
print(type(x))

# timeOfMeasurement
b = '2021-01-04T07:07:45.098+0000'
y = datetime.datetime.strptime((b[:23]).strip(), '%Y-%m-%dT%H:%M:%S.%f')
#y = (b[:23]).strip()
print(y)
print(type(y))
并创建以下输出:

2021-01-04 07:07:45.676885
<class 'datetime.datetime'>
2021-01-04 07:07:45.098000
<class 'datetime.datetime'>
我得到一个错误,说:

TypeError:startPos和length必须是相同的类型。分别得到和


我不知道问题出在哪里,因为我对整个主题完全不熟悉,如果有人能帮助我,我会非常高兴。

您需要使用PySpark函数,而不是使用Python的内置函数。您有以下几种可能性:

  • 如果字符串采用ISO8601时间格式,则只需对相应列执行
    .cast('timestamp')
df=spark.createDataFrame([('2021-01-04T07:07:45.098+0000'), “2021-01-04T07:07:45.6768856Z”), ['ts1','ts2']) >>>df.show(truncate=False) +----------------------------+----------------------------+ |ts1 | ts2| +----------------------------+----------------------------+ |2021-01-04T07:07:45.098+0000 | 2021-01-04T07:07:45.6768856Z| +----------------------------+----------------------------+ >>>select(df.ts1.cast('timestamp')、df.ts2.cast('timestamp')).show(truncate=False) +-----------------------+--------------------------+ |ts1 | ts2| +-----------------------+--------------------------+ |2021-01-04 08:07:45.098|2021-01-04 08:07:45.676885| +-----------------------+--------------------------+
  • 如果字符串具有某种自定义格式,则可以使用内置函数,如和,并提供格式字符串
  import datetime  
  df = spark.read.format('csv').options(header='true', inferSchema='true').load('/mnt/data/values.csv')
  df_adjusted = (df.withColumn("timeOfMeasurementDatetime", datetime.datetime.strptime((df.timeOfMeasurement[:23]).strip(), '%Y-%m-%dT%H:%M:%S.%f'))