[英]spark dataframe to be written in partitions
我是火花和scala的新手。 我想读取一个包含json文件的目录。 该文件具有名为“ EVENT_NAME”的属性,可以具有20个不同的值。 我需要根据属性值来分隔事件。 即EVENT_NAME = event_A事件在一起。 将它们写为hive外部表结构,例如:/ apps / hive / warehouse / db / event_A / dt = date / hour = hr
对于所有事件类型,这里有20个不同的表,与每个事件相关的数据应转到相应的表中。 我已经设法编写了一些代码,但是需要帮助才能正确地写入数据。
{
import org.apache.spark.sql._
import sqlContext._
val path = "/source/data/path"
val trafficRep = sc.textFile(path)
val trafficRepDf = sqlContext.read.json(trafficRep)
trafficRepDf.registerTempTable("trafficRepDf")
trafficRepDf.write.partitionBy("EVENT_NAME").save("/apps/hive/warehouse/db/sample")
}
最后一行创建一个分区输出,但是不是我需要的输出。 请提出如何正确执行该建议或其他任何代码来执行此建议。
我假设您的意思是您希望将数据保存到单独的目录中,而不使用Spark / Hive的{column}={value}
格式。
您将无法使用Spark的partitionBy
,因为Spark分区会强制您使用该格式。
相反,您必须将DataFrame
分成其组件分区,并一一保存,如下所示:
{
import org.apache.spark.sql._
import sqlContext._
val path = "/source/data/path"
val trafficRep = sc.textFile(path)
val trafficRepDf = sqlContext.read.json(trafficRep)
val eventNames = trafficRepDf.select($"EVENT_NAME").distinct().collect() // Or if you already know what all 20 values are, just hardcode them.
for (eventName <- eventNames) {
val trafficRepByEventDf = trafficRepDef.where($"EVENT_NAME" === eventName)
trafficRepByEventDf.write.save(s"/apps/hive/warehouse/db/sample/${eventName}")
}
}
您可以将带有日期和小时的列添加到数据框中。
import org.apache.spark.sql._
import sqlContext._
val path = "/source/data/path"
val trafficRep = sc.textFile(path)
val trafficRepDf = sqlContext.read.json(trafficRep)
trafficRepDf.withColumn("dt", lit("dtValue")).withColumn("hour", lit("hourValue"))
trafficRepDf.write.partitionBy("EVENT_NAME","dt","hour").save("/apps/hive/warehouse/db/sample")
我假设您想要一个像/apps/hive/warehouse/db/EVENT_NAME=xx/dt=yy/hour=zz
的表结构,那么您需要按EVENT_NAME
, dt
和hour
进行分区,因此请尝试以下操作:
trafficRepDf.write.partitionBy("EVENT_NAME","dt","hour").save("/apps/hive/warehouse/db/sample")
https://spark.apache.org/docs/latest/sql-programming-guide.html#upgrading-from-spark-sql-16-to-20
数据集和DataFrame API
registerTempTable
已被弃用,并由createOrReplaceTempView
取代
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.