【问题标题】:How I can do query by spark SQL when I add cloumn auto increase by querying [duplicate]当我通过查询添加列自动增加时,如何通过 spark SQL 进行查询 [重复]
【发布时间】:2017-05-22 08:29:25
【问题描述】:

我在 MySQL 中这样查询:

SELECT *,@a:=@a+1 AS rn FROM PERSON,(SELECT(@a:=0)) AS A

我想知道当我查询 DataFrame 时如何通过 spark sql 做到这一点,比如这种类型:

val strSQL=" SELECT *,@a:=@a+1 AS rn FROM PERSON,(SELECT(@a:=0)) AS A"
sqlContext.sql(strSQL)

我的问题是,当我运行这段代码时,控制台告诉我@a:=@a+1 错误,我不知道如何用 spark SQL 类型编写 SQL。

【问题讨论】:

  • 您是在模仿 Rownum 还是 LAG?如果是,Spark 中已经实现了窗口函数。
  • @a:=@a+1 是什么?
  • 是的,我要生成Rownum

标签: sql apache-spark dataframe rdd


【解决方案1】:

如果要生成行号,可以使用函数

val schema = df.schema //data frame schema 

//add rowNumberField
val rows = df.rdd.zipWithUniqueId.map{
   case (r: Row, id: Long) => Row.fromSeq(id +: r.toSeq)}

Create DataFrame with schema 

val dfWithPK = sqlContext.createDataFrame(
  rows, StructType(StructField("rowMunber", LongType, false) +: schema.fields))

也可以使用SQL函数生成行号

sqlContext.sql("select row_number() over (order by columnName) as rowNumber from Person")

或者您可以使用 Using MontotonicallyIncreasingID 方法来生成唯一的行 ID。

df.withColumn("RowNumber",monotonicallyIncreasingId)

希望这会有所帮助!

【讨论】:

  • 这里要注意的是,monotonicallyIncreasingID 按递增顺序生成非确定性值。不完全是 OP 想要的。
猜你喜欢
  • 2023-03-13
  • 2019-05-13
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多