我正在使用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?
我可以使用以下命令将 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)
你能帮我纠正一下吗?
我正在尝试将简单的文本文件读取到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)
基于此,必须更改所有后续处理以反映“值”的存在
我的问题是
我有一个包含多个具有不同架构的空值的 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?
我有一个数据框架,其架构如下所示:
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)
但这引发了以下异常:
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),
如何爆炸列properties?
创建基于 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[*]在此处给出,但在运行时我们通过纱线集群进行部署。
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)
但是,有什么方法可以在不使用数据框的情况下获得相同的结果?
我想使用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找不到列.
我一直在回顾有关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) 我有一个包含 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 和与之相关的总数。
有没有办法在火花中处理这个?