【问题标题】:How to create a sample dataframe in Scala / Spark如何在 Scala / Spark 中创建示例数据框
【发布时间】:2016-02-13 18:08:14
【问题描述】:

我正在尝试创建一个简单的DataFrame,如下所示:

import sqlContext.implicits._

val lookup = Array("one", "two", "three", "four", "five")

val theRow = Array("1",Array(1,2,3), Array(0.1,0.4,0.5))

val theRdd = sc.makeRDD(theRow)

case class X(id: String, indices: Array[Integer], weights: Array[Float] )

val df = theRdd.map{
    case Array(s0,s1,s2) =>    X(s0.asInstanceOf[String],s1.asInstanceOf[Array[Integer]],s2.asInstanceOf[Array[Float]])
}.toDF()

df.show()

df 定义为

df: org.apache.spark.sql.DataFrame = [id: string, indices: array<int>, weights: array<float>]

这就是我想要的。

执行后,我得到

org.apache.spark.SparkException:作业因阶段失败而中止:阶段 13.0 中的任务 1 失败 1 次,最近一次失败:阶段 13.0 中丢失任务 1.0(TID 50,本地主机):scala.MatchError:1(类 java.lang.String)

这个 MatchError 来自哪里?而且,有没有更简单的方法来以编程方式创建示例DataFrames

【问题讨论】:

    标签: scala spark-dataframe


    【解决方案1】:

    首先,theRow 应该是 Row 而不是 Array。现在,如果您以尊重 Java 和 Scala 之间兼容性的方式修改您的类型,那么您的示例将起作用

    val theRow =Row("1",Array[java.lang.Integer](1,2,3), Array[Double](0.1,0.4,0.5))
    val theRdd = sc.makeRDD(Array(theRow))
    case class X(id: String, indices: Array[Integer], weights: Array[Double] )
    val df=theRdd.map{
        case Row(s0,s1,s2)=>X(s0.asInstanceOf[String],s1.asInstanceOf[Array[Integer]],s2.asInstanceOf[Array[Double]])
      }.toDF()
    df.show()
    
    //+---+---------+---------------+
    //| id|  indices|        weights|
    //+---+---------+---------------+
    //|  1|[1, 2, 3]|[0.1, 0.4, 0.5]|
    //+---+---------+---------------+
    

    【讨论】:

    • 请注意,您需要import sqlContext.implicits._ 才能使用toDF
    【解决方案2】:

    另外一个例子可以参考

    import spark.implicits._
    val sqlContext = new org.apache.spark.sql.SQLContext(sc)
    
    val columns=Array("id", "first", "last", "year")
    val df1=sc.parallelize(Seq(
      (1, "John", "Doe", 1986),
      (2, "Ive", "Fish", 1990),
      (4, "John", "Wayne", 1995)
    )).toDF(columns: _*)
    
    val df2=sc.parallelize(Seq(
      (1, "John", "Doe", 1986),
      (2, "IveNew", "Fish", 1990),
      (3, "San", "Simon", 1974)
    )).toDF(columns: _*)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多