小编Wil*_*ton的帖子

Spark数据帧组合到列表中

我正在尝试对集合进行一些分析.我有一个示例数据集,如下所示:

orders.json

{"items":[1,2,3,4,5]}
{"items":[1,2,5]}
{"items":[1,3,5]}
{"items":[3,4,5]}
Run Code Online (Sandbox Code Playgroud)

它只是一个字段,它是一个代表ID的数字列表.

这是我试图运行的Spark脚本:

val sparkConf = new SparkConf()
  .setMaster("local[*]")
  .setAppName("Dataframe Test")

val sc = new SparkContext(sparkConf)
val sql = new SQLContext(sc)

val dataframe = sql.read.json("orders.json")

val expanded = dataframe
  .explode[::[Long], Long]("items", "item1")(row => row)
  .explode[::[Long], Long]("items", "item2")(row => row)

val grouped = expanded
  .where(expanded("item1") !== expanded("item2"))
  .groupBy("item1", "item2")
  .count()

val recs = grouped
  .groupBy("item1")
Run Code Online (Sandbox Code Playgroud)

创建expanded并且grouped很好,简而言之,expanded是两个ID在同一原始集中的所有可能的两个ID的列表.grouped过滤掉与自身匹配的ID,然后将所有唯一ID组合在一起并为每个ID生成计数.架构和数据样本grouped是:

root
 |-- item1: long (nullable = true)
 |-- item2: long …
Run Code Online (Sandbox Code Playgroud)

dataframe apache-spark apache-spark-sql spark-dataframe

10
推荐指数
1
解决办法
9065
查看次数

为什么过滤器默认在Spark数据帧上删除空值?

filter在包含null值的基本scala集合上,具有以下(且非常直观)的行为:

scala> List("a", "b", null).filter(_ != "a")
res0: List[String] = List(b, null)
Run Code Online (Sandbox Code Playgroud)

但是,我很惊讶地发现以下过滤器删除了火花数据帧中的空值:

scala> val df = List(("a", null), ( "c", "d")).toDF("A", "B")
scala> df.show
+---+----+
|  A|   B|
+---+----+
|  a|null|
|  c|   d|
+---+----+
scala> df.filter('B =!= "d").show
+---+---+
|  A|  B|
+---+---+
+---+---+
Run Code Online (Sandbox Code Playgroud)

如果要保留null值,我应该添加

df.filter('B =!= "d" || 'B.isNull).show
+---+----+
|  A|   B|
+---+----+
|  a|null|
+---+----+
Run Code Online (Sandbox Code Playgroud)

就个人而言,我认为默认情况下删除空值非常容易出错。为什么选择这个?为何在api文档中未明确说明?我想念什么吗?

sql null apache-spark spark-dataframe

6
推荐指数
1
解决办法
641
查看次数

计算Spark SQL DSL中的字符串长度

编辑:这是一个关于Spark 1.2的老问题

为了达到目的,我一直在尝试计算SchemaRDD中字符串列的长度.我正在学习Spark SQL,所以我的问题严格来说是使用Spark或Spark SQL公开的SQL接口,或者了解它们的局限性.

我的第一次尝试就是使用集成的关系查询

notes.select('note).orderBy(length('note))
Run Code Online (Sandbox Code Playgroud)

在编译时没有运气:

error: not found: value length
Run Code Online (Sandbox Code Playgroud)

(这让我想知道在哪里可以找到这个DSL实际上可以解决的"表达式".例如,它为列添加解析了"+".)

然后我试了一下

sql("SELECT note, length(note) as len FROM notes")
Run Code Online (Sandbox Code Playgroud)

这失败了

java.util.NoSuchElementException: key not found: length
Run Code Online (Sandbox Code Playgroud)

(然后我重读了这个(我正在运行1.2.0) http://spark.apache.org/docs/1.2.0/sql-programming-guide.html#supported-hive-features 并想知道Spark SQL是什么意思支持列出的蜂巢功能.)

问题:表达式和/或SQL语句中真正支持的长度运算符是什么?如果是,语法是什么?(奖励:是否有关于Spark SQL Expressions中解决的内容的特定文档,以及一般的语法是什么?)

谢谢!

string-length apache-spark apache-spark-sql

5
推荐指数
2
解决办法
2万
查看次数

Scaladoc:@group标签未在API文档中显示

我正在尝试使用@groupname和@group标签在我的库API文档中组织一个类的成员,但它不起作用(我正在使用sbt 0.13.11)

我的玩具build.sbt:

name := "test"
scalaVersion := "2.10.5"
Run Code Online (Sandbox Code Playgroud)

我的玩具代码src/main/scala/test.scala:

package test
/** Test class
 *
 * @groupname print Printer
 * @groupname throw Thrower
 */
class TestClass {
  /** @group print */
  def trivialPrint: Unit = print("Hello")
  /** @group throw */
  def trivialError: Unit = throw new Exception("Hello")
}
Run Code Online (Sandbox Code Playgroud)

sbt doc编译API文档,其中我的两个函数都在类的"Value Members"组中(参见截图).我究竟做错了什么?

在此输入图像描述

scala sbt scaladoc

5
推荐指数
1
解决办法
508
查看次数

Spark DataFrame `regexp_replace` 中的反向引用

我最近试图回答一个问题,当我意识到我不知道如何在 Spark DataFrames 的正则表达式中使用反向引用。

例如,使用 sed,我可以做到

> echo 'a1
b22
333' | sed "s/\([0-9][0-9]*\)/;\1/"                                                                                                   

a;1
b;22
;333
Run Code Online (Sandbox Code Playgroud)

但是使用 Spark DataFrames 我不能:

val df = List("a1","b22","333").toDF("str")
df.show

+---+
|str|
+---+
| a1|
|b22|
|333|
+---+

val res = df  .withColumn("repBackRef",regexp_replace('str,"(\\d+)$",";\\1"))
res.show

+---+-----------+
|str|repBackRef|
+---+----------+
| a1|       a;1|
|b22|       b;1|
|333|        ;1|
+---+----------+
Run Code Online (Sandbox Code Playgroud)

澄清一下:我不想要这种特殊情况下的结果,我想要一个与反向引用一样通用的解决方案,例如,sed.

还要注意 usingregexp_extract是缺乏的,因为它在没有匹配时表现不佳:

val res2 = df
  .withColumn("repExtract",regexp_extract('str,"^([A-z])+?(\\d+)$",2))
res2.show
Run Code Online (Sandbox Code Playgroud)

这样您就被迫像我在上述答案中所做的那样,对每个模式使用一列进行提取。

谢谢!

regex backreference scala apache-spark spark-dataframe

3
推荐指数
1
解决办法
2986
查看次数