pyspark将负值替换为零

时间:2018-10-24 13:20:13

标签: apache-spark pyspark apache-spark-sql pyspark-sql

我可能想寻求有关将时间戳记之间的负值替换为零的帮助。在Spark3上运行python3。这是我的代码:

代码:

timeFmt = "yyyy-MM-dd HH:mm:ss"
time_diff_1 = when((col("time1").isNotNull()) &
                       (col("time2").isNotNull()),                      
                       (unix_timestamp('time2', format=timeFmt) - unix_timestamp('time1', format=timeFmt)) / 60
                      ).otherwise(lit(0))

time_diff_2 = when((col("time2").isNotNull()) & 
                       (col("time3").isNotNull()),                       
                       (unix_timestamp('time3', format=timeFmt) - unix_timestamp('time2', format=timeFmt)) / 60
                      ).otherwise(lit(0))

time_diff_3 = when((col("time3").isNotNull()) &                           
                       (col("time4").isNotNull()),                       
                       (unix_timestamp('time4', format=timeFmt) - unix_timestamp('time3', format=timeFmt)) / 60
                      ).otherwise(lit(0))

df = (df      
      .withColumn('time_diff_1', time_diff_1)      
      .withColumn('time_diff_2', time_diff_2)
      .withColumn('time_diff_3', time_diff_3)
     )


df = (df
      .withColumn('time_diff_1', when(col('time_diff_1') < 0, 0).otherwise(col('time_diff_1')))
      .withColumn('time_diff_2', when(col('time_diff_2') < 0, 0).otherwise(col('time_diff_2')))
      .withColumn('time_diff_3', when(col('time_diff_3') < 0, 0).otherwise(col('time_diff_3')))
     )

运行上面的代码时,出现错误。 这是错误:

  

Py4JJavaError:调用o1083.showString时发生错误。 :   org.apache.spark.SparkException:由于阶段失败,作业中止了:   阶段56.0中的任务0失败4次,最近一次失败:丢失的任务   阶段56.0中的0.3(TID 7246,fxhclxcdh8.dftz.local,执行程序21):org.codehaus.janino.JaninoRuntimeException:编译失败:   org.codehaus.janino.JaninoRuntimeException:方法代码   “ apply_9 $(Lorg / apache / spark / sql / catalyst / expressions / GeneratedClass $ SpecificUnsafeProjection; Lorg / apache / spark / sql / catalyst / InternalRow;)V”   上课   “ org.apache.spark.sql.catalyst.expressions.GeneratedClass $ SpecificUnsafeProjection”   增长到64 KB以上/ * 001 / public java.lang.Object generate(Object []   引用){/ 002 /返回新   SpecificUnsafeProjection(引用); / 003 /} / 004 / / 005 /   类SpecificUnsafeProjection扩展   org.apache.spark.sql.catalyst.expressions.UnsafeProjection {/ 006 /   / 007 / private Object []引用; / 008 /私有布尔值   evalExprIsNull; / 009 /私有布尔evalExprValue; / 010 /
  私有布尔evalExpr1IsNull; /
011 /私有布尔值   evalExpr1Value; / 012 / private java.text.DateFormat formatter5;   / 013 /私有java.text.DateFormat formatter8; / 014 /
  私有java.text.DateFormat formatter12; /
015 /私人   java.text.DateFormat formatter13; / 016 /私人   UTF8String.IntWrapper包装器; / 017 /私人   java.text.DateFormat formatter15; / 018 /私人   java.text.DateFormat formatter18; / 019 /私人   java.text.DateFormat formatter19; / 020 /私人   java.text.DateFormat formatter23; / 021 /私人   java.text.DateFormat formatter26; / 022 /私人   java.text.DateFormat formatter27; / 023 /私人   java.text.DateFormat formatter30; / 024 * /私人   java.text.DateFormat formatter32; ........

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我认为更简单的方法是编写一个简单的UDF(用户定义函数)并将其应用于所需的列。这是执行此操作的示例代码:

 <input id="dateControl"
       class="form-control"
       type="text"
       formControlName="dateControl"
       placeholder="MM-DD-YYYY (required)"
       ngbDatepicker #d="ngbDatepicker"
       [maxDate]="this.maxDate"
       [startDate]="this.minDate"
       [minDate]="this.minDate"/>