spark sql dataframe字符串类型的列拼接一个常量字符串的方法

spark示例数据://spark-2.3.0-bin-hadoop2.7//examples//src//main//resources//people.json
数据内容:
{“name”:“Michael”}
{“name”:“Andy”, “age”:30}
{“name”:“Justin”, “age”:19}
创建dataframe:
val sparksession = SparkSession.builder().master(“local”).appName("spark sql demo ").getOrCreate()
val df = sparksession.read.json(“C://Users//tanhaidi//Downloads//spark-2.3.0-bin-hadoop2.7//examples//src//main//resources//people.json”)
import sparksession.implicits._
相信大家看书或者看网上例子的时候,都会遇到下面这个语句(dollar符号打出来会出问题,这里贴上图片):
在这里插入图片描述
结果:
±------±--------+
| name|(age + 1)|
±------±--------+
|Michael| null|
| Andy| 31|
| Justin| 20|
±------±--------+
那我看到这的时候就会想,age字符是个int类型,可以直接加1,那name字段是个字符串类型,可以直接拼接一个字符串吗?
尝试着写了一下:
在这里插入图片描述
结果:
±-----------±—+
|(name + abc)| age|
±-----------±—+
| null|null|
| null| 30|
| null| 19|
±-----------±—+
都是空???这个肯定不是我们想看到的结果,我们想要的是名字后面加上“abc”这样的。
通过查资料,发现select方法有两个重构方法,一个方法的参数都是String,另一个方法的参数都是Column,那么我写的代码,相当于一个Column类型的字段加了一个字符串(“abc”),这样一定会有问题的。
这里就想,怎么能把"abc"从字符串转换成一个Column类型的列呢?通过查资料发现真有这么一个函数lit()!!!
用这个函数,貌似可以解决这个问题,代码:
在这里插入图片描述
结果:±------±---------------+
| name|concat(name, ab)|
±------±---------------+
|Michael| Michaelab|
| Andy| Andyab|
| Justin| Justinab|
±------±---------------+
附上全部代码(好多都注释了,学习用)

package com.bj58.spark

import org.apache.spark.sql.functions._
import org.apache.spark.sql.SparkSession
import org.slf4j.LoggerFactory

object SparkSqlDemo {

  val logger = LoggerFactory.getLogger(this.getClass)
  case class Person(name:String ,age:Long)

  def main(args :Array[String]) = {
    val sparksession = SparkSession.builder().master("local").appName("spark sql demo ").getOrCreate()

    val df = sparksession.read.json("C://Users//tanhaidi//Downloads//spark-2.3.0-bin-hadoop2.7//examples//src//main//resources//people.json")
    import sparksession.implicits._
//    println(df.first().mkString)
//    df.printSchema()


//    df.select($"name").show()
//    df.select("name").show()
//    df.show()
//    println("order by name :")
//    df.orderBy("name").show()
//    println("""order by df("name").asc : """)
//    df.orderBy(df("name").asc_nulls_last).show()
//
//    println("gorup by name : ")
//    df.groupBy("name").count().show()
  // drop字段的三种方法
  //  df.drop("name").show()
  //  df.drop($"name").show()
  //   df.drop(df("name")).show()

//   df.withColumn("name1",$"name" + "abc").show()
df.select($"name"+"abc",$"age").show()

    // 书中示例:年龄+1岁
    df.select($"name",$"age"+1).show()
    //  自己尝试:字符串类型的列拼接一个字符串
    df.select($"name",concat($"name",lit("ab"))).show()
    //   自己尝试:用withColumn方法实现字符串类型的列拼接一个字符串
    df.withColumn("newcol",concat($"name",lit("+...abc"))).show()


// org.apache.spark.sql.functions.
 //    df.select($"name",$"age"+1).show()
//    df.filter($"age">21).show()
//    df.groupBy("name").count().show()
//    df.show()
//    df.createOrReplaceTempView("people")


//    val sqldf = sparksession.sql("select * from people")
//    sqldf.show()
//
//    df.createGlobalTempView("people")
//    sparksession.sql("select * from global_temp.people").show()
//    sparksession.newSession().sql("select * from global_temp.people")show()
//    sparksession.sql("select concat(name,'abc'),age from people where name = 'Justin' ").show()



//    val caseClassDS = Seq(Person("tanhaidi",32)).toDS()
//    val ds2 = Seq(Person("zhangsan",2),Person("lisi",3)).toDS()
//
//    val arr1 =   ds2.collect()
//
//    for (i <- arr1) { println(s"姓名:${i.name} + 年龄:${i.age}") }
//
//       ds2.show()
//
//    caseClassDS.show()
    // logger.info("dataset的第一行信息:"+caseClassDS.first().name + caseClassDS.first().age)














  sparksession.stop()




  }



}

解决!!!
之所以写这篇博客,是因为可能好多初学者可能都会遇到这样的疑问,网上找资料的时候,也不会针对这个做讲解,所以这里多嘴总结一下。

你可能感兴趣的:(大数据开发,sql,spark)