我是Scala的新手.为什么"map"函数不可序列化?如何使其可序列化?例如,如果我的代码如下所示:
val data = sc.parallelize(List(1,4,3,5,2,3,5))
def myfunc(iter: Iterator[Int]) : Iterator[Int] = {
val lst = List(("a", 1),("b", 2),("c",3), ("a",2))
var res = List[Int]()
while (iter.hasNext) {
val cur = iter.next
val a = lst.groupBy(x => x._1).mapValues(_.size)
//val b= a.map(x => x._2)
res = res ::: List(cur)
}
res.iterator
}
data.mapPartitions(myfunc).collect
Run Code Online (Sandbox Code Playgroud)
如果我取消注释该行
val b= a.map(x => x._2)
Run Code Online (Sandbox Code Playgroud)
代码返回一个异常:
org.apache.spark.SparkException: Task not serializable
Caused by: java.io.NotSerializableException: scala.collection.immutable.MapLike$$anon$2
Serialization stack:
- object not serializable (class: scala.collection.immutable.MapLike$$anon$2, value: Map(1 -> 3))
- field (class: …
Run Code Online (Sandbox Code Playgroud) 为什么rdd.sample()
Spark RDD 上的函数返回不同数量的元素,即使fraction参数相同?例如,如果我的代码如下所示:
val a = sc.parallelize(1 to 10000, 3)
a.sample(false, 0.1).count
Run Code Online (Sandbox Code Playgroud)
每次我运行代码的第二行时,它返回一个不等于1000的不同数字.实际上我希望每次看到1000,尽管1000个元素可能不同.谁能告诉我如何获得样本大小恰好等于1000的样本?非常感谢你.
我想从Scala列表或数组(不是RDD)中随机抽样,样本大小可能比列表或数组的长度长得多,我该如何有效地做到这一点?因为样本量可能非常大,并且需要在很多次进行采样(在不同的列表/数组上).
我知道对于Spark RDD,我们可以使用takeSample()来实现它,是否有Scala列表/数组的等价物?
非常感谢你.
我想根据列的范围值对data.table进行分组,如何使用dplyr库执行此操作?
例如,我的数据表如下所示:
library(data.table)
library(dplyr)
DT <- data.table(A=1:100, B=runif(100), Amount=runif(100, 0, 100))
Run Code Online (Sandbox Code Playgroud)
现在我想将DT分组为B组0.05间隔的20组,并计算每组中的行数.例如,列B值在[0,0.05]范围内的任何行将形成一个组; 列B值在[0.05,0.1]范围内的任何行将形成另一个组,依此类推.有没有一种有效的方法来完成这个群组功能?
非常感谢你.
-----------------------------关于akrun答案的更多问题.谢谢akrun的回答.我有一个关于"剪切"功能的新问题.如果我的DT如下:
DT <- data.table(A=1:10, B=c(0.01, 0.04, 0.06, 0.09, 0.1, 0.13, 0.14, 0.15, 0.17, 0.71))
Run Code Online (Sandbox Code Playgroud)
使用以下代码:
DT %>%
group_by(gr=cut(B, breaks= seq(0, 1, by = 0.05), right=F) ) %>%
summarise(n= n()) %>%
arrange(as.numeric(gr))
Run Code Online (Sandbox Code Playgroud)
我希望看到这样的结果:
gr n
1 [0,0.05) 2
2 [0.05,0.1) 2
3 [0.1,0.15) 3
4 [0.15,0.2) 2
5 [0.7,0.75) 1
Run Code Online (Sandbox Code Playgroud)
但我得到的结果是这样的:
gr n
1 [0,0.05) 2
2 [0.05,0.1) 2
3 [0.1,0.15) 4
4 [0.15,0.2) 1 …
Run Code Online (Sandbox Code Playgroud) 我有一个RDD MANY列(例如,几百个),我怎么在这个RDD的末尾添加一个多列?
例如,如果我的RDD如下所示:
123, 523, 534, ..., 893
536, 98, 1623, ..., 98472
537, 89, 83640, ..., 9265
7297, 98364, 9, ..., 735
......
29, 94, 956, ..., 758
Run Code Online (Sandbox Code Playgroud)
如何向其中添加一列,其值是第二列和第三列的总和?
非常感谢你.
如何使用dplyr获取数据表的两列平均值?例如,如果我的数据如下所示:
dt <- data.table(A=1:5, B=c(1,4,NA,6,8))
Run Code Online (Sandbox Code Playgroud)
我想创建一个新列"Avg",它是每行的A列和B列的平均值:
dt %>% mutate(Avg=mean(c(A, B), na.rm=T))
Run Code Online (Sandbox Code Playgroud)
但是这段代码并没有给我正确的结果.这该怎么做?非常感谢你.
如果我有一个带有5个元素的元组的RDD,例如RDD(Double,String,Int,Double,Double)
如何使用第五个元素有效地对此RDD进行排序?
我试图将这个RDD映射到键值对并使用sortByKey,但看起来sortByKey非常慢,它比我收集这个RDD慢,并且在收集的数组上使用了sortWith.为什么会这样?
非常感谢你.
我在grid()
里面使用barplot()
.因为我希望将条形图绘制在网格的顶部,所以我使用了panel.first
参数.但是,网格线与y轴的刻度不匹配.谁能告诉我如何解决这个问题?我的代码如下,谢谢.
WRE <- c(1423, 41721)
bp <- barplot(WRE, xaxt = 'n', xlab = '', yaxt = 'n', las = 3, width = 0.5,
space = 1.5, main = paste("How You Compare", sep = ""), ylab = "",
names.arg = NA, col = c("red","blue"), cex.lab = 1,
panel.first = grid(nx = NA, ny = NULL))
axis(1, at=bp, labels=c("Average Claims", "Your Claims"),
tick=FALSE, las=1, line=-1, cex.axis=1)
axis(2, at=axTicks(2), sprintf("$%s", formatC(axTicks(2), digits=9, big.mark=",", width=-1)),
cex.axis=0.9, las=2)
Run Code Online (Sandbox Code Playgroud) 如果我在Scala中有一个数组数组(类似于矩阵),那么总结矩阵的每一列的有效方法是什么?例如,如果我的数组数组如下所示:
val arr = Array(Array(1, 100, ...), Array(2, 200, ...), Array(3, 300, ...))
Run Code Online (Sandbox Code Playgroud)
我想总结每一列(例如,总结所有子数组的第一个元素,总结所有子数组的第二个元素等)并得到一个新的数组,如下所示:
newArr = Array(6, 600, ...)
Run Code Online (Sandbox Code Playgroud)
如何在Spark Scala中有效地完成此操作?
我在Shiny中使用renderTable来显示数据集,并且我想对表格进行一些格式化。例如,如果我的代码如下所示:
ui.R:
shinyUI(fluidPage(
titlePanel("Hello Shiny!"),
fluidRow(
column(4,
... ...
)
),
column(8,
tableOutput("mydata")
)
)
))
Run Code Online (Sandbox Code Playgroud)
server.R:
shinyServer(function(input, output) {
df <- data.frame(A=1:10, B=11:20)
output$mydata <- renderTable(df)
})
Run Code Online (Sandbox Code Playgroud)
此示例仅显示一个非常基本的表。如果我想将表格宽度设置为列宽度的100%,而A列占据表格宽度的70%并向左对齐,则B列占据表格宽度的30%并向右对齐,并且列名的背景色设置为蓝色,如何使用renderTable实现呢?非常感谢您的帮助。
顺便说一句,我可以参考关于renderTable格式设置的任何文档吗?
我在R中分配data.table列有一个问题.我的示例代码如下所示:
library(data.table)
DT <- data.table(A=c(3,5,2,6,4), B=c(6,2,7,2,1), Amount=1:5)
setkey(DT, A)
amt <- DT$Amount
amt #3 1 5 2 4
setkey(DT, B)
amt #5 2 4 1 3
Run Code Online (Sandbox Code Playgroud)
我使用"$"符号将data.table的列分配给变量"amt",但看起来在我更改了data.table的顺序之后,"amt"的顺序也被更改了.谁能告诉我为什么会这样?我怎样才能避免这种情况的发生(当我改变DT的顺序时,我不希望改变"amt"的顺序)?
非常感谢你.
我有一个包含3列的数据表:ID,Type和Count.对于每个ID,我希望在此ID中获得具有前2个Count的Type,并将结果展平为一行.例如,如果我的数据表如下所示:
ID Type Count
A 1 8
B 1 3
A 2 5
A 3 2
B 2 1
B 3 4
Run Code Online (Sandbox Code Playgroud)
然后我希望我的输出是两行,如下所示:
ID Top1Type Top1TypeCount Top2Type Top2TypeCount
A 1 8 2 5
B 3 4 1 3
Run Code Online (Sandbox Code Playgroud)
谁能告诉我如何使用R中的dplyr库实现这一目标?非常感谢你.
什么是在Scala中总结数组的每个n元素的有效方法?例如,如果我的数组如下所示:
val arr = Array(3,1,9,2,5,8,...)
Run Code Online (Sandbox Code Playgroud)
我想总结这个数组的每3个元素并得到一个新的数组,如下所示:
newArr = Array(13, 15, ...)
Run Code Online (Sandbox Code Playgroud)
如何在Spark Scala中有效地完成此操作?非常感谢你.