Questions tagged «apache-spark»

Apache Spark是用Scala编写的开源分布式数据处理引擎,为用户提供了统一的API和分布式数据集。Apache Spark的用例通常与机器/深度学习,图处理有关。

5
在Spark中更新数据框列
查看新的spark数据框api,尚不清楚是否可以修改数据框列。 我怎么会去改变行的值x列y一个数据帧的? 在pandas这将是df.ix[x,y] = new_value 编辑:合并以下内容,您将无法修改现有数据框,因为它是不可变的,但是您可以返回具有所需修改的新数据框。 如果您只想根据条件替换列中的值,例如np.where: from pyspark.sql import functions as F update_func = (F.when(F.col('update_col') == replace_val, new_value) .otherwise(F.col('update_col'))) df = df.withColumn('new_column_name', update_func) 如果要对列执行某些操作并创建一个添加到数据框的新列: import pyspark.sql.functions as F import pyspark.sql.types as T def my_func(col): do stuff to column here return transformed_value # if we assume that my_func returns a …

1
Spark代码组织和最佳实践
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 改善这个问题 因此,在面向对象的世界中花了很多年并始终考虑代码重用,设计模式和最佳实践之后,我发现自己在Spark世界中在代码组织和代码重用方面有些挣扎。 如果我尝试以可重用的方式编写代码,那么它几乎总是会带来性能上的损失,最终我会将其重写为适合我的特定用例的最佳方式。这个常量“写出最适合该特定用例的内容”也会影响代码的组织,因为当“它们都真正属于一起”时,很难将代码拆分为不同的对象或模块,因此我最终只有很少的包含长代码的“上帝”对象复杂转换链。实际上,我经常认为,如果我回顾了当我在面向对象的世界中工作时所写的大部分Spark代码,我会退缩并将其视为“意大利面条式代码”。 我上网冲浪试图找到与面向对象世界的最佳做法相当的东西,但是运气不佳。我可以找到一些函数式编程的“最佳实践”,但是Spark只是增加了一层,因为性能是这里的主要因素。 所以我想问的是,您是否有任何Spark专家找到了一些您可以推荐的编写Spark代码的最佳实践? 编辑 正如评论中所写,我实际上并不希望有人发布有关如何解决该问题的答案,而是我希望这个社区中的某人遇到过一些Martin Fowler类型的人,他曾在某处写过som文章或博客文章。关于如何解决Spark世界中代码组织的问题。 @DanielDarabos建议我举一个例子说明代码组织和性能冲突的情况。虽然我发现我在日常工作中经常遇到此问题,但我很难将其归结为一个很好的最小示例;)但我会尝试的。 在面向对象的世界中,我是“单一责任原则”的忠实拥护者,因此,我将确保我的方法仅负责一件事。它使它们可重用且易于测试。因此,例如,如果我必须计算列表中某些数字的总和(与某些条件匹配),并且必须计算同一数字的平均值,那么我绝对可以创建两种方法-一种计算和,然后计算平均值。像这样: def main(implicit args: Array[String]): Unit = { val list = List(("DK", 1.2), ("DK", 1.4), ("SE", 1.5)) println("Summed weights for DK = " + summedWeights(list, "DK") println("Averaged weights for DK = " + averagedWeights(list, "DK") } def summedWeights(list: …

4
工人,工人实例和执行者之间是什么关系?
在Spark Standalone模式下,存在主节点和工作节点。 这里有几个问题: 2个工作程序实例是否意味着一个具有2个工作程序进程的工作程序节点? 是每个工作实例都拥有一个特定应用程序的执行程序(用于管理存储,任务),还是一个工作节点拥有一个执行程序? 是否有流程图说明spark在运行时如何工作,例如字数统计?

5
如何在列表中使用Column.isin?
val items = List("a", "b", "c") sqlContext.sql("select c1 from table") .filter($"c1".isin(items)) .collect .foreach(println) 上面的代码引发以下异常。 Exception in thread "main" java.lang.RuntimeException: Unsupported literal type class scala.collection.immutable.$colon$colon List(a, b, c) at org.apache.spark.sql.catalyst.expressions.Literal$.apply(literals.scala:49) at org.apache.spark.sql.functions$.lit(functions.scala:89) at org.apache.spark.sql.Column$$anonfun$isin$1.apply(Column.scala:642) at org.apache.spark.sql.Column$$anonfun$isin$1.apply(Column.scala:642) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245) at scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33) at scala.collection.mutable.WrappedArray.foreach(WrappedArray.scala:35) at scala.collection.TraversableLike$class.map(TraversableLike.scala:245) at scala.collection.AbstractTraversable.map(Traversable.scala:104) at org.apache.spark.sql.Column.isin(Column.scala:642) 以下是我修复它的尝试。它编译并运行,但不返回任何匹配项。不知道为什么。 …

2
将OFF_HEAP存储与Spark 1.4.0和Tachyon 0.6.4一起使用时出错
我正在尝试使用Spark 1.4.0和Tachyon 0.6.4上的堆外存储来保持我的RDD,如下所示: val a = sqlContext.parquetFile("a1.parquet") a.persist(org.apache.spark.storage.StorageLevel.OFF_HEAP) a.count() 之后,我得到以下异常。 有什么想法吗? 15/06/16 10:14:53 INFO : Tachyon client (version 0.6.4) is trying to connect master @ localhost/127.0.0.1:19998 15/06/16 10:14:53 INFO : User registered at the master localhost/127.0.0.1:19998 got UserId 3 15/06/16 10:14:53 INFO TachyonBlockManager: Created tachyon directory at /tmp_spark_tachyon/spark-6b2512ab-7bb8-47ca-b6e2-8023d3d7f7dc/driver/spark-tachyon-20150616101453-ded3 15/06/16 10:14:53 …

10
如何透视Spark DataFrame?
我开始使用Spark DataFrames,我需要能够旋转数据以在多行1列中创建多列。在Scalding中有内置的功能,我相信Python中的Pandas,但是对于新的Spark Dataframe我找不到任何东西。 我假设我可以编写某种自定义函数来执行此操作,但是我什至不确定如何开始,尤其是因为我是Spark的新手。我谁都知道如何使用内置功能来做到这一点,或者对如何在Scala中编写东西的建议,这一点深表感谢。


12
如何从Spark中的CSV文件中跳过标题?
假设我给出了三个要读取的Spark上下文的文件路径,并且每个文件的第一行都有一个架构。我们如何从标题中跳过模式行? val rdd=sc.textFile("file1,file2,file3") 现在,我们如何跳过此rdd的标题行?

5
计算平均道路速度[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 3天前关闭。 我去了数据工程师的工作面试。面试官问我一个问题。他给了我一些情况,并请我设计该系统的数据流。我解决了,但他不喜欢我的解决方案,但我失败了。我想知道您是否有更好的想法来解决这一挑战。 问题是: 我们的系统接收四个数据流。数据包含车辆ID,速度和地理位置坐标。每个车辆每分钟发送一次数据。特定的流与特定的道路,车辆或其他任何东西之间没有任何联系。有一个函数可以接受协调并返回路段名称。我们需要知道每路路段每5分钟的平均速度。最后,我们要将结果写入Kafka。 所以我的解决方案是: 首先将所有数据写入一个Kafka集群,并写入一个主题,然后按纬度的5-6位数字与经度的5-6位数字进行划分。然后通过结构化流读取数据,通过协调为每一行添加路段名称(为此有一个预定义的udf),然后通过路段名称来简化数据。 因为我将Kafka中的数据按协调的前5-6位进行分区,所以在将协调转换为节名称后,无需将大量数据传输到正确的分区,因此可以利用colesce()操作不会触发完全洗牌。 然后计算每个执行者的平均速度。 整个过程每5分钟发生一次,我们将以Append模式将数据写入最终的Kafka接收器。 再次,面试官不喜欢我的解决方案。有人可以建议如何改进它,还是一个完全不同的更好的主意?

2
同时调度许多Spark作业时出现死锁
通过spark FIFO调度程序使用在YARN集群模式下运行的spark 2.4.4。 我正在使用线程数可变的线程池执行程序来提交多个spark数据帧操作(即,将数据写入S3)。如果我有约10个线程,则可以正常工作,但如果使用数百个线程,则似乎出现了死锁,根据Spark UI没有安排任何作业。 哪些因素控制可以同时调度多少个作业?驱动程序资源(例如内存/内核)?其他一些Spark配置设置? 编辑: 这是我的代码的简要提要 ExecutorService pool = Executors.newFixedThreadPool(nThreads); ExecutorCompletionService<Void> ecs = new ExecutorCompletionService<>(pool); Dataset<Row> aHugeDf = spark.read.json(hundredsOfPaths); List<Future<Void>> futures = listOfSeveralHundredThings .stream() .map(aThing -> ecs.submit(() -> { df .filter(col("some_column").equalTo(aThing)) .write() .format("org.apache.hudi") .options(writeOptions) .save(outputPathFor(aThing)); return null; })) .collect(Collectors.toList()); IntStream.range(0, futures.size()).forEach(i -> ecs.poll(30, TimeUnit.MINUTES)); exec.shutdownNow(); 在某个时候,随着nThreads增加,spark似乎不再在安排任何作业,如以下所示: ecs.poll(...) 最终超时 …

2
Spark:在我的用例中,为什么Python明显优于Scala?
为了比较使用Python和Scala时Spark的性能,我用两种语言创建了相同的作业,并比较了运行时。我希望两个作业都花费大致相同的时间,但是Python作业仅花费27min,而Scala作业却花费了37min(将近40%!)。我也用Java实现了同样的工作,而且也花了很多37minutes时间。Python怎么可能这么快? 最小的可验证示例: Python工作: # Configuration conf = pyspark.SparkConf() conf.set("spark.hadoop.fs.s3a.aws.credentials.provider", "org.apache.hadoop.fs.s3a.AnonymousAWSCredentialsProvider") conf.set("spark.executor.instances", "4") conf.set("spark.executor.cores", "8") sc = pyspark.SparkContext(conf=conf) # 960 Files from a public dataset in 2 batches input_files = "s3a://commoncrawl/crawl-data/CC-MAIN-2019-35/segments/1566027312025.20/warc/CC-MAIN-20190817203056-20190817225056-00[0-5]*" input_files2 = "s3a://commoncrawl/crawl-data/CC-MAIN-2019-35/segments/1566027312128.3/warc/CC-MAIN-20190817102624-20190817124624-00[0-3]*" # Count occurances of a certain string logData = sc.textFile(input_files) logData2 = sc.textFile(input_files2) a = logData.filter(lambda value: …

1
从Pyspark df到PostgresSQL写入超过5000万,这是最有效的方法
从Spark数据帧向Postgres Tables插入数百万条记录(例如5000万条)的最有效方法是。过去,我通过使用批量复制和批处理大小选项(从成功的火花到MSSQL)做到了这一点 。 Postgres是否有类似的东西? 添加我尝试过的代码以及运行该过程所花费的时间: def inserter(): start = timer() sql_res.write.format("jdbc").option("numPartitions","5").option("batchsize","200000")\ .option("url", "jdbc:postgresql://xyz.com:5435/abc_db") \ .option("dbtable", "public.full_load").option("user", "root").option("password", "password").save() end = timer() print(timedelta(seconds=end-start)) inserter() 因此,我对1000万条记录执行了上述方法,并按中指定的进行了5个并行连接,numPartitions并尝试了200k的批量大小。 该过程花费的总时间为0:14:05.760926(十四分五秒)。 还有其他有效的方法可以减少时间吗? 我可以使用的有效或最佳批次大小是多少?增加我的批量大小会更快地完成工作吗?还是打开多个连接,即> 5可以帮助我更快地完成此过程? 在一个平均14分钟10万条记录是不坏,但找的人在那里谁也以前做过这有助于回答这个问题。

3
在安装spark 2.4.4后尝试运行pyspark时如何解决'TypeError:整数是必需的(got类型字节)'错误
我已经安装了OpenJDK 13.0.1,python 3.8和spark 2.4.4。测试安装的说明是从spark安装的根目录运行。\ bin \ pyspark。我不确定是否错过了Spark安装步骤,例如设置一些环境变量,但是找不到任何进一步的详细说明。 我可以在我的机器上运行python解释器,因此我确信它已正确安装,并且运行“ java -version”可以给我预期的响应,因此我认为这两个问题都不是问题。 我从cloudpickly.py中获得了错误的堆栈跟踪: Traceback (most recent call last): File "C:\software\spark-2.4.4-bin-hadoop2.7\bin\..\python\pyspark\shell.py", line 31, in <module> from pyspark import SparkConf File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\__init__.py", line 51, in <module> from pyspark.context import SparkContext File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\context.py", line 31, in <module> from pyspark import accumulators File "C:\software\spark-2.4.4-bin-hadoop2.7\python\pyspark\accumulators.py", line 97, …

1
熊猫UDF和pyarrow 0.15.0
最近,我开始pyspark在EMR群集上运行的许多作业中遇到一堆错误。错误是 java.lang.IllegalArgumentException at java.nio.ByteBuffer.allocate(ByteBuffer.java:334) at org.apache.arrow.vector.ipc.message.MessageSerializer.readMessage(MessageSerializer.java:543) at org.apache.arrow.vector.ipc.message.MessageChannelReader.readNext(MessageChannelReader.java:58) at org.apache.arrow.vector.ipc.ArrowStreamReader.readSchema(ArrowStreamReader.java:132) at org.apache.arrow.vector.ipc.ArrowReader.initialize(ArrowReader.java:181) at org.apache.arrow.vector.ipc.ArrowReader.ensureInitialized(ArrowReader.java:172) at org.apache.arrow.vector.ipc.ArrowReader.getVectorSchemaRoot(ArrowReader.java:65) at org.apache.spark.sql.execution.python.ArrowPythonRunner$$anon$1.read(ArrowPythonRunner.scala:162) at org.apache.spark.sql.execution.python.ArrowPythonRunner$$anon$1.read(ArrowPythonRunner.scala:122) at org.apache.spark.api.python.BasePythonRunner$ReaderIterator.hasNext(PythonRunner.scala:406) at org.apache.spark.InterruptibleIterator.hasNext(InterruptibleIterator.scala:37) at org.apache.spark.sql.execution.python.ArrowEvalPythonExec$$anon$2.<init>(ArrowEvalPythonExec.scala:98) at org.apache.spark.sql.execution.python.ArrowEvalPythonExec.evaluate(ArrowEvalPythonExec.scala:96) at org.apache.spark.sql.execution.python.EvalPythonExec$$anonfun$doExecute$1.apply(EvalPythonExec.scala:127)... 它们似乎都发生在apply熊猫系列的功能中。我发现的唯一更改是pyarrow在星期六(05/10/2019)更新的。测试似乎适用于0.14.1 因此,我的问题是,是否有人知道这是新更新的pyarrow中的错误,还是有一些重大更改会导致pandasUDF将来难以使用?

1
Apache Spark:重新分区,排序和缓存对联接的影响
我正在探索将表联接到自身时Spark的行为。我正在使用Databricks。 我的虚拟场景是: 读取外部表作为数据框A(底层文件为增量格式) 将数据框B定义为仅选择某些列的数据框A 在column1和column2上连接数据框A和B (是的,这没有多大意义,我只是在尝试了解Spark的基本机制) a = spark.read.table("table") \ .select("column1", "column2", "column3", "column4") \ .withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5"))))) b = a.select("column1", "column2", "columnA") c= a.join(b, how="left", on = ["column1", "column2"]) 我的第一次尝试是按原样运行代码(尝试1)。然后,我尝试重新分区和缓存(尝试2) a = spark.read.table("table") \ .select("column1", "column2", "column3", "column4") \ .withColumn("columnA", lower((concat(col("column4"), lit("_"), col("column5"))))) .repartition(col("column1"), col("column2")).cache() 最后,我重新分区,排序和缓存 a = …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.