我有一个空表Hive
我的意思是该表中没有记录。
使用这个空表,我在pyspark
中创建了一个data frame
df = sqlContext.table("testing.123_test")
我已将此data frame
注册为临时表
df.registerTempTable('mytempTable')
date=datetime.now().strftime('%Y-%m-%d %H:%M:%S')
在此表中,我有名为id
的列。
现在我想像下面这样查询临时表
min_id = sqlContext.sql("select nvl(min(id),0) as minval from mytempTable").collect()[0].asDict()['minval']
max_id = sqlContext.sql("select nvl(max(id),0) as maxval from mytempTable").collect()[0].asDict()['maxval']
现在我想将date
、min_id
和max_id
保存到一个文件中HDFS
我做了如下工作:
from pyspark.sql import functions as f
(sqlContext.table("myTempTable").select(f.concat_ws(",", f.first(f.lit(date)), f.min("id"), f.max("id"))).coalesce(1).write.format("text").mode("append").save("/tmp/fooo"))
现在,当我在HDFS
中检查文件时,它会显示所有 NULL 值。
HDFS
中的文件输出如下。
NULL,NULL,NULL
我想要的是
Date,0,0
Here date is the current timestamp
我怎样才能实现我想要的。
这是在scala中,但你应该能够轻松地将其复制到Python。 您在这里需要的功能是na.fill
函数。你必须在下面的代码中用Python字典替换Scala Maps:
这是您的DF的样子:
scala> nullDF.show
+----+----+----+
|date| x| y|
+----+----+----+
|null|null|null|
+----+----+----+
// You have already done this using Python's datetime functions
val format = new java.text.SimpleDateFormat("dd/MM/YYYY HH:mm:ss")
val curr_timestamp = format.format(new java.util.Date())
//Use na fill to replace null values
//Column names as keys in map
//And values are what you want to replace NULL with
val df = nullDF.na.fill(scala.collection.immutable.Map(
"date" -> ) ,
"x" -> "0" ,
"y" -> "0" ) )
这应该给你
+-------------------+---+---+
| date| x| y|
+-------------------+---+---+
|10/06/2017 12:10:20| 0| 0|
+-------------------+---+---+