Scala Spark-将所有时间戳列转换为特定的日期格式
我有一个用例,需要从配置单元表(拼花地板)读取数据,将时间戳列转换为特定格式,并将输出写入csv 对于日期格式,我想编写一个函数,它接受一个StructField并返回原始字段名或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
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()
中,还是不将用作,我都会出错。见编辑后的答案