spark中用scala与java不同的几个点

1.类型转换,Long转为Int
newVid=((10000+vid)+idx*10000).asInstanceOf[Int]
vidl=vids.substring(vids.length-18).toLong


2.自定义函数
定义与调用
import org.apache.spark.sql.functions._
def getInt():Int={
  0
}

val colInit = udf(getInt _)

val newColDF=rawUserArtistData.toDF("ref", "page", "article", "vid", "createDate")
    .withColumn("vid", col("vid").cast(DataTypes.LongType))
    .withColumn("article", col("article").cast(DataTypes.IntegerType))
    .withColumn("user",colInit())





3.修改dataFrame里的值
修改值,转为修改列,用withColumn。增加列,也用withColumn。

如果第一个参数是已有列名,则是修改值,如果是新的列名,则是增加。
其中,修改的值可以是常量,也可以是函数。比如下面的getInt(0),就是一函数。
把DataFrame定义为var,可直接修改。定义成val则用返回的新的DataFrame对象

rawUserArtistData.show(6)
val  ls: Column = when(col("notice_id").equalTo(137), getInt(0)).
  otherwise("3")
val rawUserArtistDataTmp = rawUserArtistData.withColumn("notice_id",ls)
rawUserArtistDataTmp.show(6)

def getInt(key:Int):Int={
    0
}






删除一列
dataDF.drop("ORIGIN_COUNTRY_NAME").show(2)

4.map函数里的小坑。
如果map函数里使用了函数外部变量,那么需先用collect方法,再用map方法。这样,里面修改的值,在外面才可见。


val users = new mutable.HashMap[String,Int]
var userKey:Int=0

//调用了collect后,里面的修改才能生效
newColDF.collect().map( row => {
  val vids: String = row.getAs[String]("vid")
  val userIndex=users.get(vids)
  if(userIndex.isEmpty){
    userKey = userKey+1
    users.put(vids,userKey)
  }
  (users,userKey)
})
println("maxUser:"+userKey)


5.从Array转为Rdd再转为dataFrame

import org.apache.spark.sql.{Column, DataFrame, Dataset, Row, SparkSession, types}

val needGroupArray=newColDF.collect().map( row => {
  Row(users.get(row.getAs[String]("vid")).get,row.getAs[Int]("article"),row.getAs[String]("createDate"))
})

val schema=types.StructType(
    List(
    StructField("user",DataTypes.IntegerType,false),
    StructField("article",DataTypes.IntegerType,false),
    StructField("createDate",DataTypes.StringType,false)
    )
)
val userRdd=spark.sparkContext.parallelize(needGroupArray)
//println(userRdd)
val needGroupDf=spark.createDataFrame(userRdd,schema)
其中newColDF是DataFrame类型,needGroupArray是Array类型,userRdd 是RDD类型,这三个可成一个循环转换。


6.foreach与map的区别,map有返回值,foreach没有

7.scala的for的语法

for( i <- 1 to 1000 ){
}

文/程忠 浏览次数:0次   2023-01-28 08:08:45

相关阅读


评论:
点击刷新

↓ 广告开始-头部带绿为生活 ↓
↑ 广告结束-尾部支持多点击 ↑