【问题标题】:spark: read parquet file and process itspark:读取 parquet 文件并处理它
【发布时间】:2017-04-24 21:16:17
【问题描述】:

我是 Spark 1.6 的新手。我想阅读一个镶木地板文件并进行处理。 为了简化假设有一个具有这种结构的镶木地板:

id, amount, label

我有 3 条规则:

amount < 10000 => label=LOW
10000 < amount < 100000 => label=MEDIUM
amount > 1000000 => label = HIGH

如何在 spark 和 scala 中做到这一点?

我尝试这样的事情:

case class SampleModels(
  id: String,
  amount: Double,
  label: String,
)

val sc = SparkContext.getOrCreate()
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._

val df = sqlContext.read.parquet("/path/file/")
val ds = df.as[SampleModels].map( row=>
    MY LOGIC 
    WRITE OUTPUT IN PARQUET
)

这是正确的方法吗?它有效率吗? “MYLOGIC”可能更复杂。

谢谢

【问题讨论】:

    标签: scala apache-spark parquet


    【解决方案1】:

    是的,这是使用 spark 的正确方法。如果您的逻辑很简单,您可以尝试使用内置函数直接对数据帧进行操作(例如 when 在您的情况下),它会比将行映射到案例类并在 jvm 中执行代码要快一些将能够轻松地将结果保存回镶木地板。

    【讨论】:

    • 这是正确的答案。一般来说,更喜欢使用 spark 数据帧/数据集操作。这些操作将传递给 Spark SQL 的 Catalyst Optimizer,这是一个优化引擎,在后台运行以更好地执行您的查询。
    【解决方案2】:

    是的,这是正确的方法。 它会遍历您的完整数据以构建您需要的额外列。

    如果你想要一个sql方式,这是要走的路,

    val df = sqlContext.read.parquet("/path/file/")
    df.registerTempTable("MY_TABLE")
    val df2 = sqlContext.sql("select *, case when amount < 10000 then LOW else HIGH end as label from MY_TABLE")
    

    请记住使用 hiveContext 而不是 sparkContext。

    【讨论】:

      猜你喜欢
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 2016-07-17
      • 1970-01-01
      • 2017-09-25
      • 2018-10-04
      • 2016-12-15
      相关资源
      最近更新 更多