小编phi*_*ert的帖子

VarArgs A*vs Seq [A]参数起作用

我正在使用Scala 2.11.如果我创建一个像这样的函数:

def func1 (a: Int* ) : Int = a.reduce(_+_)
Run Code Online (Sandbox Code Playgroud)

我叫它用

func1(1,2,3,4)
// 10
func1(Seq(1,2,3,4) : _*)
//10
Run Code Online (Sandbox Code Playgroud)

这很好.

但是当我尝试定义一个函数文字时:

val func2:(Int*) => Int = _.reduce(_+_)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误说:

<console>:5: error: type mismatch;
 found   : Int* => Int
 required: Seq[Int] => Int
  lazy val $result = INSTANCE.`func2`
Run Code Online (Sandbox Code Playgroud)

为什么它Seq[Int]在第二种情况下需要a 而不是在第一种情况下,虽然定义是相同的?

如何在第一种情况下传递varargs,以便可以通过它们调用reduce?

scala

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

如何使用pyspark将bz2文件读入数据帧?

我可以使用以下命令将 json 文件读入 Pyspark 中的数据帧

spark = SparkSession.builder.appName('GetDetails').getOrCreate()
df = spark.read.json("path to json file")
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将 bz2(压缩的 csv)读入数据帧时,它给了我一个错误。我在用:

spark = SparkSession.builder.appName('GetDetails').getOrCreate()
df = spark.read.load("path to bz2 file")
Run Code Online (Sandbox Code Playgroud)

你能帮我纠正一下吗?

python apache-spark apache-spark-sql pyspark

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

Spark中sc.textFile和spark.read.text之间的区别

我正在尝试将简单的文本文件读取到Spark RDD中,我发现有两种方法可以这样做:

from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[*]").getOrCreate()
sc = spark.sparkContext
textRDD1 = sc.textFile("hobbit.txt")
textRDD2 = spark.read.text('hobbit.txt').rdd
Run Code Online (Sandbox Code Playgroud)

然后我查看数据,发现两个RDD的结构不同

textRDD1.take(5)

['The king beneath the mountain',
 'The king of carven stone',
 'The lord of silver fountain',
 'Shall come unto his own',
 'His throne shall be upholden']

textRDD2.take(5)

[Row(value='The king beneath the mountain'),
 Row(value='The king of carven stone'),
 Row(value='The lord of silver fountain'),
 Row(value='Shall come unto his own'),
 Row(value='His throne shall be upholden')]
Run Code Online (Sandbox Code Playgroud)

基于此,必须更改所有后续处理以反映“值”的存在

我的问题是

  • 使用这两种方式读取文本文件意味着什么?
  • 在什么情况下应该使用哪种方法?

apache-spark rdd

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

Spark DataFrameWriterignoreNullFields 不工作

我有一个包含多个具有不同架构的空值的 DataFrame

df.show(false)
+----+----+----+----+
|col1|col2|col3|col4|
+----+----+----+----+
|null|null|1   |a   |
+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)

我试图将此数据帧作为 JSON 文件写入 HDFS,但 Spark 在写入 JSON 时忽略了 null 字段。这是可以理解的,因为默认ignoreNullFields设置为true

但即使当我使用

spark.write.option("ignoreNullFields", "false").json(...)
Run Code Online (Sandbox Code Playgroud)

或者

spark.write.option("ignoreNullFields", false).json(...)
Run Code Online (Sandbox Code Playgroud)

包含空值的列将被省略。

使用该选项时我遗漏了什么吗ignoreNullFields?

apache-spark apache-spark-sql

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

在Spark中分解结构列时出错

我有一个数据框架,其架构如下所示:

event: struct (nullable = true)
|    | event_category: string (nullable = true)
|    | event_name: string (nullable = true)
|    | properties: struct (nullable = true)
|    |    | ErrorCode: string (nullable = true)
|    |    | ErrorDescription: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用以下代码爆炸该struct列properties:

df_json.withColumn("event_properties", explode($"event.properties"))
Run Code Online (Sandbox Code Playgroud)

但这引发了以下异常:

cannot resolve 'explode(`event`.`properties`)' due to data type mismatch: 
input to function explode should be array or map type, 
not StructType(StructField(IDFA,StringType,true),
Run Code Online (Sandbox Code Playgroud)

如何爆炸列properties?

scala apache-spark apache-spark-sql pyspark spark-dataframe

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

spark-submite 中的 Spark 部署相关属性

创建基于 Spark 的 Java 应用程序时,SparkConf 是使用创建的

sparkConf = new SparkConf().setAppName("SparkTests")
                           .setMaster("local[*]").set("spark.executor.memory", "2g")
                           .set("spark.driver.memory", "2g")
                           .set("spark.driver.maxResultSize", "2g");
Run Code Online (Sandbox Code Playgroud)

但是在这里的文档中,它说

任何指定为标志或属性文件中的值都将传递给应用程序并与通过 SparkConf 指定的值合并。直接在 SparkConf 上设置的属性具有最高优先级,然后标志传递给 spark-submit 或 spark-shell,然后是 spark-defaults.conf 文件中的选项。自早期版本的 Spark 以来,一些配置键已被重命名;在这种情况下,旧的密钥名称仍然被接受,但比新密钥的任何实例的优先级都低。Spark属性主要可以分为两种:一种是和deploy相关的,比如“spark.driver.memory”、“spark.executor.instances”,这类属性在运行时通过SparkConf编程设置时可能不受影响,或者行为取决于您选择的集群管理器和部署模式,所以建议通过配置文件或spark-submit命令行选项进行设置;另一个主要是关于Spark运行时的控制,比如“spark.task.maxFailures”,这种属性可以任意设置。

那么是否有这些部署相关属性的列表,我只能在 spark-submit 中将其作为命令行参数给出?

它local[*]在此处给出,但在运行时我们通过纱线集群进行部署。

java apache-spark

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

如何在没有数据框的情况下在Spark中执行列表达式

Column如果仅使用Literal(没有数据框列),有什么方法可以评估我的表达式。

例如,类似:

val result: Int = someFunction(lit(3) * lit(5))
//result: Int = 15
Run Code Online (Sandbox Code Playgroud)

要么

import org.apache.spark.sql.function.sha1
val result: String = someFunction(sha1(lit("5")))
//result: String = ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4
Run Code Online (Sandbox Code Playgroud)

我可以使用数据框进行评估

val result = Seq(1).toDF.select(sha1(lit("5"))).as[String].first
//result: String = ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4
Run Code Online (Sandbox Code Playgroud)

但是,有什么方法可以在不使用数据框的情况下获得相同的结果?

apache-spark apache-spark-sql

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

如何在apache spark中同时使用dataset.select和selectExpr

我想使用Spark(2.2)数据集提供下面提到的数据

Name    Age Age+5

A       10  15

B       5   10

C       25  30
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下内容:

dataset.select( 
        dataset.col("Name"), 
        dataset.col("Age),
        dataset.col( dataset.selectExpr("Age"+5).toString() )
       );
Run Code Online (Sandbox Code Playgroud)

这会抛出异常,因为Age找不到列.

apache-spark apache-spark-dataset

4
推荐指数
1
解决办法
9538
查看次数

为什么array_contains在SQL中接受两个参数的列而不在Dataset API中接受列?

我一直在回顾有关StackOverflow上的array_contains(和isin)方法的问题和答案,我仍然无法回答以下问题:

为什么array_contains在SQL中接受列(引用)作为参数,而标准函数却没有?

我可以理解上述问题很容易被标记为"主要基于意见"或类似问题,所以让我将其改为以下内容:

如何使用array_contains标准函数,以便它接受来自列的参数(值)?

scala> spark.version
res0: String = 2.3.0

val codes = Seq(
  (Seq(1, 2, 3), 2),
  (Seq(1), 1),
  (Seq.empty[Int], 1),
  (Seq(2, 4, 6), 0)).toDF("codes", "cd")
scala> codes.show
+---------+---+
|    codes| cd|
+---------+---+
|[1, 2, 3]|  2|
|      [1]|  1|
|       []|  1|
|[2, 4, 6]|  0|
+---------+---+

// array_contains in SQL mode works with arguments being columns
val q = codes.where("array_contains(codes, cd)")
scala> q.show
+---------+---+
|    codes| cd|
+---------+---+
|[1, …
Run Code Online (Sandbox Code Playgroud)

apache-spark apache-spark-sql

4
推荐指数
2
解决办法
600
查看次数

使用 spark 和 Scala 读取文本文件中的 JSON

我有一个包含 JSON 数据的文本文件,如下所示:

{
  "element" : value,
  "id" : value,
  "total" : []
}
{
  "element" : value,
  "id" : value,
  "total: []
}
Run Code Online (Sandbox Code Playgroud)

所有 JSON 都以新行分隔。

我正在尝试将所有文​​本文件数据加载到临时视图中:

sqlContext.read.textFiles("/path").createOrReplaceTempView("result")

val data = sqlContext.sql("select * from result").collect()
Run Code Online (Sandbox Code Playgroud)

结果:

[{"element" : value,"id" : value,"total" : [] }]
[{"element" : value,"id" : value, "total" : []}]
Run Code Online (Sandbox Code Playgroud)

我需要提取 id 和与之相关的总数。

有没有办法在火花中处理这个?

text json scala apache-spark

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