我有一个与pyspark repartitionBy()函数相关的问题,我最初在这个问题的评论中发布了这个问题.我被要求将其作为一个单独的问题发布,所以这里是:
据我所知,df.partitionBy(COL)将每个值写入所有行COL到他们自己的文件夹,并且每个文件夹将(假设行以前通过其他键分布在所有分区上)具有与之前在文件中大致相同的文件数.整张桌子.我发现这种行为很烦人.如果我有一个包含500个分区的大表,并且我partitionBy(COL)在一些属性列上使用,我现在有100个文件夹,每个文件夹包含500个(现在非常小)文件.
我想要的是partitionBy(COL)行为,但文件大小和文件数量大致相同.
作为演示,上一个问题共享一个玩具示例,其中有一个包含10个分区的表,partitionBy(dayOfWeek)并且现在有70个文件,因为每个文件夹中有10个.我想要~10个文件,每天一个,可能需要2或3天,有更多的数据.
这可以轻松完成吗?喜欢的东西,df.write().repartition(COL).partitionBy(COL)好像它可能工作,但我担心,(在一个非常大的表,该表将被划分为多个文件夹的情况下),其首先将它结合到一些小的分区数之前做的partitionBy(COL)似乎是一个坏主意.
任何建议都非常感谢!
有没有办法从pyspark中的Spark ML获取ROC曲线上的点?在文档中,我看到了一个 Scala 的例子,但不是 python:https : //spark.apache.org/docs/2.1.0/mllib-evaluation-metrics.html
那正确吗?我当然可以想出实现它的方法,但我不得不想象如果有一个预先构建的函数它会更快。我正在处理 300 万个分数和几十个模型,所以速度很重要。
我正在尝试使用gsubR来替换我正在处理的一些字符串中的一堆奇怪的字符.一切正常,除非我投入"]",这使整个事情无所作为.我正在使用\\,gsub("[\\?\\*\\]]", "", name)但它仍然无法正常工作.这是我的实际例子:
name <- "R U Still Down? [Remember Me]"
Run Code Online (Sandbox Code Playgroud)
我想要的是:names成为"R U Still Down Remember Me"
当我这样做:
names <- gsub("[\\(\\)\\*\\$\\+\\?'\\[]", "", name)
它半工作,我得到"R U Still Down Remember Me]"
但是当我这样做时:
names <- gsub("[\\(\\)\\*\\$\\+\\?'\\[\\]]", "", name)
没有任何反应.(即我得到"R U Still Down? [Remember Me]")
有任何想法吗?我试过切换事情的顺序,等等.但我似乎无法弄明白.
我正在将一个巨大的csv(18GB)加载到内存中,并注意到R和Python之间存在很大的差异.这是在AWS ec2 r4.8xlarge上,它有244 Gb的内存.显然这是一个极端的例子,但原理也适用于真实机器上的小文件.
使用pd.read_csv我的文件需要大约30分钟加载并占用174Gb的内存.基本上这么多,以至于我无法用它做任何事情.相比之下,fread()来自data.table封装的R 需要大约7分钟而且只有~55Gb的内存.
为什么pandas对象占用的内存比data.table对象多得多?此外,为什么从根本上说,熊猫对象几乎比磁盘上的文本文件大10倍?它不像.csv是一种特别有效的方式来存储数据.
最近,我一直在使用future(andfuture.apply和furrr) 在 R 中进行一些并行处理,这大部分都很棒,但我偶然发现了一些我无法解释的东西。这可能是某个地方的错误,但也可能是我编码的草率。如果有人能解释这种行为,我们将不胜感激。
我正在对数据的不同子组运行模拟。对于每个组,我想运行模拟n时间,然后计算结果的一些汇总统计数据。以下是一些示例代码,用于重现我的基本设置并演示我所看到的问题:
library(tidyverse)
library(future)
library(future.apply)
# Helper functions
#' Calls out to `free` to get total system memory used
sys_used <- function() {
.f <- system2("free", "-b", stdout = TRUE)
as.numeric(unlist(strsplit(.f[2], " +"))[3])
}
#' Write time, and memory usage to log file in CSV format
#' @param .f the file to write to
#' @param .id identifier for the row to be written
mem_string <- function(.f, .id) …Run Code Online (Sandbox Code Playgroud) 我正在尝试做一些非常简单的事情,但我遇到了一些非常愚蠢的斗争。我认为这一定与对 Spark 正在做什么的根本误解有关。我将不胜感激任何帮助或解释。
我有一个非常大的(~3 TB,~300MM 行,25k 分区)表,在 s3 中保存为镶木地板,我想给某人一个小样本作为单个镶木地板文件。不幸的是,这需要很长时间才能完成,我不明白为什么。我尝试了以下方法:
tiny = spark.sql("SELECT * FROM db.big_table LIMIT 500")
tiny.coalesce(1).write.saveAsTable("db.tiny_table")
Run Code Online (Sandbox Code Playgroud)
然后当那不起作用时,我尝试了这个,我认为应该是一样的,但我不确定。(我添加了print' 以进行调试。)
tiny = spark.table("db.big_table").limit(500).coalesce(1)
print(tiny.count())
print(tiny.show(10))
tiny.write.saveAsTable("db.tiny_table")
Run Code Online (Sandbox Code Playgroud)
当我看纱UI,都打印报表,并在write使用25K映射器。在count历时3分钟,则show花了25分钟,并且write把〜40分钟,虽然最后没有写我一直在寻找一个文件表。
在我看来,第一行应该取前 500 行并将它们合并到一个分区,然后其他行应该发生得非常快(在单个映射器/减速器上)。谁能看到我在这里做错了什么?有人告诉我也许我应该使用sample而不是,limit但据我所知它limit应该快得多。那正确吗?
提前感谢您的任何想法!
我有一个关于在 R 中使用 S3 类执行某些操作的“正确”方法的问题。我想要做的是有一个方法可以更改类,然后在新类上调用相同的方法。像这样的东西:
my_func <- function(.x, ...) {
UseMethod("my_func")
}
my_func.character <- function(.x, ...) {
return(paste(".x is", .x, "of class", class(.x)))
}
my_func.numeric <- function(.x, ...) {
.x <- as.character(.x)
res <- my_func(.x) # this should call my_func.character
return(res)
}
Run Code Online (Sandbox Code Playgroud)
这有效。当我执行以下操作时,我会character同时获得课程
> my_func("hello")
[1] ".x is hello of class character"
> my_func(1)
[1] ".x is 1 of class character"
Run Code Online (Sandbox Code Playgroud)
我的问题是:这是正确的方法吗?在转换类之后重新调用相同的方法(这一行res <- my_func(.x))感觉很奇怪。
我觉得NextMethod()一定是答案,但我读过很多关于它的文档(例如这个和这个),但他们都讨论了这个事情,它跳到类列表中的下一个类,例如例如,data.frame直到matrix您拥有class(df) …
基本上,我在两个不同的列中有纬度和经度(在网格上).我得到了一个新坐标集的两元素列表(可能是numpy数组),我想在添加它之前检查它是否是重复的.
例如,我的数据:
df = pd.DataFrame([[4,8, 'wolf', 'Predator', 10],
[5,6,'cow', 'Prey', 10],
[8, 2, 'rabbit', 'Prey', 10],
[5, 3, 'rabbit', 'Prey', 10],
[3, 2, 'cow', 'Prey', 10],
[7, 5, 'rabbit', 'Prey', 10]],
columns = ['lat', 'long', 'name', 'kingdom', 'energy'])
newcoords1 = [4,4]
newcoords2 = [7,5]
Run Code Online (Sandbox Code Playgroud)
是否可以写一个if语句告诉我是否已经存在具有该纬度和经度的行.在伪代码中:
if newcoords1 in df['lat', 'long']:
print('yes! ' + str(newcoords1))
Run Code Online (Sandbox Code Playgroud)
(在这个例子中,newcoords1应该false而且newcoords2应该是true.
旁注:(newcoords1[0] in df['lat']) & (newcoords1[1] in df['long'])不起作用,因为它独立地检查它们,但我需要知道该组合是否出现在一行中.
先感谢您!
如果这是一个愚蠢的问题,我很抱歉,但我似乎无法理解它。我对 SQL 相当陌生,这种行为在 R 或 Pandas 或我习惯使用的其他东西中会很奇怪。
基本上,我在两个不同的数据库中有两个表,有一个公共键user_id。我想加入所有列
SELECT * FROM db1.first_table t1
JOIN db2.second_table t2
ON t1.user_id = t2.user_id
Run Code Online (Sandbox Code Playgroud)
太好了,它有效。除了有两个(相同的)列称为user_id. 这并不重要,除了我在 pyspark 中执行此操作时,当我尝试将连接表导出到平面文件时,我收到一个错误,即其中两列具有相同的名称。对此有解决方法,但我只是想知道是否有人可以解释为什么连接返回两 user_id列。它似乎是一个内部连接,因此根据定义,列是相同的。为什么它会同时返回?
作为一个附带问题,是否有一种简单的方法可以避免这种行为?
提前致谢!
我正在尝试做一些看起来很简单的事情,但我无法弄清楚。我有一个像这样的小玩意:
> df <- tibble::tribble(
~col_a, ~col_b,
1, "A",
2, "B",
3, "C",
)
> df
# # A tibble: 3 x 2
# col_a col_b
# <dbl> <chr>
# 1 A
# 2 B
# 3 C
Run Code Online (Sandbox Code Playgroud)
我想把它变成一个看起来像这样的列表
> str(res_list)
# List of 3
# $ :List of 2
# ..$ col_a: num 1
# ..$ col_b: chr "A"
# $ :List of 2
# ..$ col_a: num 2
# ..$ col_b: chr "B"
# $ :List of 2 …Run Code Online (Sandbox Code Playgroud)