【发布时间】:2017-04-13 13:15:21
【问题描述】:
我是 spark 新手,我发现自己经常纠结于将一个元组转换为另一个元组,这可能非常复杂,例如 (r._1 -> (r._2._1, r._2._2) , r._3),并对此感到困惑。有什么可以改进的吗?
【问题讨论】:
标签: apache-spark rdd bigdata
我是 spark 新手,我发现自己经常纠结于将一个元组转换为另一个元组,这可能非常复杂,例如 (r._1 -> (r._2._1, r._2._2) , r._3),并对此感到困惑。有什么可以改进的吗?
【问题讨论】:
标签: apache-spark rdd bigdata
不要使用元组,定义有意义的案例类。而不是
val rdd = sc.parallelize(Seq((1, "foo", (2, 2.0)), (2, "bar", (-1, 1.0))))
使用
case class Meta(someValue: Int, anotherValue: Double)
case class Record(x: Int, y: String, meta: Meta)
val records = sc.parallelize(Seq(
Record(1, "foo", Meta(2, 2.0)),
Record(2, "bar", Meta(-1, 1.0))))
records.map(record => (record.meta.anotherValue, record.x))
如果您使用元组,则更喜欢带有有用绑定的模式匹配而不是索引。
rdd.map {
case (x, _, (_, anotherValue)) => (anotherValue, x)
}
【讨论】:
我建议使用DataFrames,您可以在其中按名称访问列。这使您可以生成更好的可读代码。此外,您可以将这些帧存储为 parquet 文件,这些文件不仅存储效率很高,而且还包含模式信息。这些操作的执行效率很高,通常不需要切换回RDDs。
【讨论】: