Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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
Scala Spark-将所有时间戳列转换为特定的日期格式_Scala_Dataframe_Apache Spark_Apache Spark Sql - Fatal编程技术网

Scala Spark-将所有时间戳列转换为特定的日期格式

Scala Spark-将所有时间戳列转换为特定的日期格式,scala,dataframe,apache-spark,apache-spark-sql,Scala,Dataframe,Apache Spark,Apache Spark Sql,我有一个用例,需要从配置单元表(拼花地板)读取数据,将时间戳列转换为特定格式,并将输出写入csv 对于日期格式,我想编写一个函数,它接受一个StructField并返回原始字段名或date\u格式($“col\u name”,“dd MMM yyyy hh.mm.ss a”),如果数据类型是时间类型。这就是我到目前为止的想法 def main (String[] args) { val hiveSchema = args(0) val hiveName = args(1) val m

我有一个用例,需要从配置单元表(拼花地板)读取数据,将时间戳列转换为特定格式,并将输出写入csv

对于日期格式,我想编写一个函数,它接受一个StructField并返回原始字段名或
date\u格式($“col\u name”,“dd MMM yyyy hh.mm.ss a”)
,如果
数据类型
时间类型
。这就是我到目前为止的想法

def main (String[] args) {
  val hiveSchema = args(0)
  val hiveName = args(1)
  val myDF = spark.table(s"${hiveSchema}.${hiveTable}")
  
  val colArray = myDF.schema.fields.map(getColumns)
  val colString = colArray.mkString(",")
  
  myDF.select(colString).write.format("csv").mode("overwrite").option("header", "true").save("/tmp/myDF")
}

def getColumns(structField: StructField): String = structField match {
  case structField if(structField.dataType.simpleString.equalsIgnoreCase("TimestampType")) => s"""date_format($$"${structField.name}", "dd-MMM-yy hh.mm.ss a")"""
  case _ => structField.name
}
但我在运行时遇到以下错误

org.apache.spark.sql.AnalysisException:无法解析给定输入列[mySchema.myTable.first_name,mySchema.myTable.my_date_col]`date_format($$“my_date_col”,“dd MMM yy hh.mm.ss a”)`


有更好的方法吗?

删除双美元符号和引号。此外,无需
mkString
;只需使用
选择expr

def main (String[] args) {
  val hiveSchema = args(0)
  val hiveName = args(1)
  val myDF = spark.table(s"${hiveSchema}.${hiveTable}")
  
  val colArray = myDF.schema.fields.map(getColumns)
  
  myDF.selectExpr(colArray: _*).write.format("csv").mode("overwrite").option("header", "true").save("/tmp/myDF")
}

def getColumns(structField: StructField): String = structField match {
  case structField if(structField.dataType.simpleString.equalsIgnoreCase("TimestampType")) => s"""date_format(${structField.name}, "dd-MMM-yy hh.mm.ss a") as ${structField.name}"""
  case _ => structField.name
}

谢谢,成功了!我现在正试图向date_format列添加一个别名,如so
s”““date_format(${structField.name},“dd MMM yy hh.mm.ss a”)。alias(${structField.name})””
,但无论我是将
${structField.name}
保留在
alias()
中,还是不将
用作
,我都会出错。见编辑后的答案