如何在Spark中跳过RDD中的多行标题

时间:2015-09-30 23:47:06

标签: python apache-spark

我的第一个RDD中的数据就像

1253
545553
12344896
1 2 1
1 43 2
1 46 1
1 53 2

现在前三个整数是我需要广播的一些计数器。 之后,所有行都具有相同的格式,如

1 2 1
1 43 2

我会在3个计数器之后将所有这些值映射到新的RDD后,在函数中进行一些计算。 但我无法理解如何分离前3个值并正常映射其余值。

我的Python代码就像这样

documents = sc.textFile("file.txt").map(lambda line: line.split(" "))

final_doc = documents.map(lambda x: (int(x[0]), function1(int(x[1]), int(x[2])))).reduceByKey(lambda x, y: x + " " + y)

只有当前3个值不在文本文件中但它们带有错误时才有效。

我不想跳过前3个值,而是将它们存储在3个广播变量中,然后在地图函数中传递剩余的数据集。

是的,文本文件只能是那种格式。我无法删除这3个值/计数器

Function1正在进行一些计算并返回值。

3 个答案:

答案 0 :(得分:5)

  1. Python 2的导入

    from __future__ import print_function
    
  2. 准备虚拟数据:

    s = "1253\n545553\n12344896\n1 2 1\n1 43 2\n1 46 1\n1 53 2"
    with open("file.txt", "w") as fw: fw.write(s)
    
  3. 阅读原始输入:

    raw = sc.textFile("file.txt")
    
  4. 提取标题:

    header = raw.take(3)
    print(header)
    ### [u'1253', u'545553', u'12344896']
    
  5. 过滤行:

    • 使用zipWithIndex

      content = raw.zipWithIndex().filter(lambda kv: kv[1] > 2).keys()
      print(content.first())
      ## 1 2 1
      
    • 使用mapPartitionsWithIndex

      from itertools import islice
      
      content = raw.mapPartitionsWithIndex(
          lambda i, iter: islice(iter, 3, None) if i == 0 else iter)
      
      print(content.first())
      ## 1 2 1
      
  6. 注意:所有赠送金额均转至pzecevicSean Owen(请参阅相关来源)。

答案 1 :(得分:1)

首先使用take()方法取值为zero323建议

raw  = sc.textfile("file.txt")
headers = raw.take(3)

然后

final_raw = raw.filter(lambda x: x != headers)

并完成。

答案 2 :(得分:0)

就我而言,我有一个如下的csv文件

----- HEADER START -----
We love to generate headers
#who needs comment char?
----- HEADER END -----

colName1,colName2,...,colNameN
val__1.1,val__1.2,...,val__1.N

花一天时间找出我的答案

val rdd = spark.read.textFile(pathToFile)  .rdd
  .zipWithIndex() // get tuples (line, Index)
  .filter({case (line, index) => index > numberOfLinesToSkip})
  .map({case (line, index) => l}) //get rid of index
val ds = spark.createDataset(rdd) //convert rdd to dataset
val df=spark.read.option("inferSchema", "true").option("header", "true").csv(ds) //parse csv

Scala中的对不起代码,但是可以轻松地转换为python