【问题标题】:error: value show is not a member of String错误:值显示不是字符串的成员
【发布时间】:2017-08-20 10:48:19
【问题描述】:

如果在这种情况下我想 show header 。为什么我不能在第三行写header.show()? 我要如何查看头变量的内容?

val hospitalDataText = sc.textFile("/Users/bhaskar/Desktop/services.csv")
val header = hospitalDataText.first() //Remove the header

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    如果您想要DataFrame,请使用DataFrameReaderlimit

    spark.read.text(path).limit(1).show
    

    否则只是println

    println(header)
    

    除非你当然想使用cats Show。与猫一起添加包到spark.jars.packages

    import cats.syntax.show._
    import cats.instances.string._
    
    sc.textFile(path).first.show
    

    【讨论】:

      【解决方案2】:

      如果你使用 sparkContext (sc.textFile),你会得到一个 RDD。您收到错误是因为header 不是dataframe 而是rdd。而show 仅适用于dataframedataset

      您必须使用 sqlContextnot sparkContext 阅读文本文件。

      你可以使用sqlContextshow(1)作为

      val hospitalDataText = sqlContext.read.csv("/Users/bhaskar/Desktop/services.csv")
      hospitalDataText.show(1, false)
      

      更新以获得更多说明

      sparkContext 将创建 rdd,可以在

      中看到
      scala> val hospitalDataText = sc.textFile("file:/test/resources/t1.csv")
      hospitalDataText: org.apache.spark.rdd.RDD[String] = file:/test/resources/t1.csv MapPartitionsRDD[5] at textFile at <console>:25
      

      如果你使用.first(),那么RDD[String]的第一个字符串被提取为

      scala> val header = hospitalDataText.first()
      header: String = test1,26,BigData,test1
      

      现在在下面回答您的评论,是的您可以从刚刚创建的 header 字符串创建 dataframe

      以下将把字符串放在一个column

      scala> val sqlContext = spark.sqlContext
      sqlContext: org.apache.spark.sql.SQLContext = org.apache.spark.sql.SQLContext@3fc736c4
      
      scala> import sqlContext.implicits._
      import sqlContext.implicits._
      
      scala> Seq(header).toDF.show(false)
      +----------------------+
      |value                 |
      +----------------------+
      |test1,26,BigData,test1|
      +----------------------+
      

      如果你想把每个字符串放在不同的列中,你可以这样做

      scala> val array = header.split(",")
      array: Array[String] = Array(test1, 26, BigData, test1)
      
      scala> Seq((array(0), array(1), array(2), array(3))).toDF().show(false)
      +-----+---+-------+-----+
      |_1   |_2 |_3     |_4   |
      +-----+---+-------+-----+
      |test1|26 |BigData|test1|
      +-----+---+-------+-----+
      

      您甚至可以将标题名称定义为

      scala> Seq((array(0), array(1), array(2), array(3))).toDF("col1", "number", "text2", "col4").show(false)
      +-----+------+-------+-----+
      |col1 |number|text2  |col4 |
      +-----+------+-------+-----+
      |test1|26    |BigData|test1|
      +-----+------+-------+-----+
      

      更高级的方法是使用 sqlContext.createDataFrame 并定义 Schema

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-03
        • 2016-11-07
        相关资源
        最近更新 更多