Scala 要在分区中写入的spark数据帧

Scala 要在分区中写入的spark数据帧,scala,apache-spark,Scala,Apache Spark,我不熟悉spark和scala。我想读取包含json文件的目录。该文件具有名为“EVENT_NAME”的属性,该属性可以有20个不同的值。我需要根据属性值来分隔事件。i、 e.事件名称=事件一起发生。在配置单元外部表结构中写入这些内容,如:/apps/hive/warehouse/db/event\u A/dt=date/hour=hr 在这里,我有20个不同的表,用于所有事件类型,与每个事件相关的数据都应该放到相应的表中。 我已经成功地编写了一些代码,但需要帮助才能正确地编写数据 { impo

我不熟悉spark和scala。我想读取包含json文件的目录。该文件具有名为“EVENT_NAME”的属性,该属性可以有20个不同的值。我需要根据属性值来分隔事件。i、 e.事件名称=事件一起发生。在配置单元外部表结构中写入这些内容,如:/apps/hive/warehouse/db/event\u 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")
}

最后一行创建了一个分区输出,但不是我需要它的确切程度。请建议如何使其正确或使用任何其他代码。

我假设您需要一个类似于
/apps/hive/warehouse/db/EVENT_NAME=xx/dt=yy/hour=zz
,然后需要按
事件名称
dt
hour
进行分区,请尝试以下操作:

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")

您可以将带有日期和小时的列添加到数据框中

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")

您可以将带有日期和小时的列添加到数据框中

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")

Dataset和DataFrame API
RegisterTempable
已被弃用,并被
createOrReplaceTempView

Dataset和DataFrame API
RegisterTempable
已被弃用,并被
createOrReplaceTempView


我假设您的意思是希望将数据保存到单独的目录中,而不使用Spark/Hive的
{column}={value}
格式

您将无法使用Spark的
partitionBy
,因为Spark分区强制您使用该格式

相反,您必须将
数据帧
分解为其组件分区,并逐个保存,如下所示:

{
  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}")
  }
}
{
导入org.apache.spark.sql_
导入sqlContext_
val path=“/source/data/path”
val trafficRep=sc.textFile(路径)
val trafficRepDf=sqlContext.read.json(trafficRep)
val eventNames=trafficRepDf.select($“EVENT_NAME”).distinct().collect()//或者如果您已经知道所有20个值是什么,只需硬编码即可。

对于(eventName,我假设您的意思是希望将数据保存到单独的目录中,而不使用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}")
  }
}
{
导入org.apache.spark.sql_
导入sqlContext_
val path=“/source/data/path”
val trafficRep=sc.textFile(路径)
val trafficRepDf=sqlContext.read.json(trafficRep)
val eventNames=trafficRepDf.select($“EVENT_NAME”).distinct().collect()//或者如果您已经知道所有20个值是什么,只需硬编码即可。

对于(eventName),数据中没有日期和时间信息。我需要从外部提供。数据中没有日期和时间信息。我需要从外部提供。