概述
基于spark,使用scala语言:
object Test {
def main(args: Array[String]): Unit = {
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder().appName("encoder_test").master("local").getOrCreate()
val m1 = Map("a" -> 1)
val m2 = Map("b" -> 10)
val m3 = Map("c" -> 100)
val seq1 = Seq(m1, m2, m3)
val a1 = Array(1, 2, 3)
val a2 = Array(3, 5)
val a3 = Array(1, 2, 3)
val seq2 = Seq(a1, a2, a3)
val s1 = "abc"
val s2 = "abc2"
val s3 = "abc3"
val seq3 = Seq(s1, s2, s3)
import org.apache.spark.sql.Row
val r1 = Row(1, "a")
val r2 = Row(2, "b")
val r3 = Row(3, "c")
val seq4 = Seq(r1, r2, r3)
val seqt = seq1.zip(seq2).zipWithIndex.map { case (v, idx) => (v._1, v._2, seq3(idx)) }
val seq = seqt.zipWithIndex.map { case (v, idx) => (v._1, v._2, v._3, seq4(idx)) }
import spark.implicits._
import org.apache.spark.sql.Encoder
import org.apache.spark.sql.Encoders
import org.apache.spark.sql.catalyst.encoders.RowEncoder
import org.apache.spark.sql.types._
val encoder = Encoders.tuple(
newMapEncoder[Map[String, Int]],
newIntArrayEncoder,
Encoders.STRING,
RowEncoder(
StructType(
Seq(
StructField("num", IntegerType),
StructField("str", StringType)))))
val d = spark.createDataset(seq)(encoder)
d.printSchema()
d.show()
}
}
输出:
root
|-- _1: map (nullable = true)
| |-- key: string
| |-- value: integer (valueContainsNull = false)
|-- _2: array (nullable = true)
| |-- element: integer (containsNull = false)
|-- _3: string (nullable = true)
|-- _4: struct (nullable = true)
| |-- num: integer (nullable = true)
| |-- str: string (nullable = true)
+----------+---------+----+------+
| _1| _2| _3| _4|
+----------+---------+----+------+
| [a -> 1]|[1, 2, 3]| abc|[1, a]|
| [b -> 10]| [3, 5]|abc2|[2, b]|
|[c -> 100]|[1, 2, 3]|abc3|[3, c]|
+----------+---------+----+------+
说明:
其中import spark.implicits._
返回一个继承SQLImplicits
的对象,SQLImplicits
里面实现了常见的Encoder
,如上面用到了
implicit def newMapEncoder[T <: Map[_, _]](implicit arg0: scala.reflect.api.JavaUniverse.TypeTag[T]): Encoder[T]
implicit def newIntArrayEncoder: Encoder[Array[Int]]
分别实现了Map和Array[Int]的编码器。
最后
以上就是瘦瘦电脑为你收集整理的spark:使用Encoder生成DataFrame的全部内容,希望文章能够帮你解决spark:使用Encoder生成DataFrame所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复