Apache spark 使用Spark合并两个或多个文件内容并操作内容

Apache spark 使用Spark合并两个或多个文件内容并操作内容,apache-spark,awk,sed,pyspark,Apache Spark,Awk,Sed,Pyspark,我可以使用Spark执行以下操作吗? 我有三个文件要合并和更改内容: 第一个名为column_header.tsv的文件包含以下内容: first_name last_name address zip_code browser_type John Doe 111 New Drive, Ca 11111 34 Mary Doe 133 Creator Blvd, NY 44499 40 Mike Coder 13 Jumping Street UT

我可以使用Spark执行以下操作吗? 我有三个文件要合并和更改内容:

  • 第一个名为column_header.tsv的文件包含以下内容:

    first_name last_name address zip_code browser_type
    
    John    Doe 111 New Drive, Ca   11111   34
    Mary    Doe 133 Creator Blvd, NY    44499   40
    Mike    Coder   13  Jumping Street  UT  66499   28
    
  • 第二个名为data_file.tsv的文件包含以下内容:

    first_name last_name address zip_code browser_type
    
    John    Doe 111 New Drive, Ca   11111   34
    Mary    Doe 133 Creator Blvd, NY    44499   40
    Mike    Coder   13  Jumping Street  UT  66499   28
    
  • 第三个名为browser_type.tsv的文件,包含以下内容:

    34  Chrome
    40  Safari
    28  FireFox
    
  • 火花处理后的最终_output.tsv文件应包含以下内容:

    first_name last_name address zip_code browser_type
    John    Doe 111 New Drive, Ca   11111   Chrome
    Mary    Doe 133 Creator Blvd, NY    44499   Safari
    Mike    Coder   13  Jumping Street  UT  66499   FireFox
    

  • 这能用火花吗?如果可能的话,我会考虑SED或AWK。我知道Python可以实现上述功能,但我更喜欢使用Spark进行数据操作和更改。有什么建议吗?提前谢谢。

    这是可能的。读取标题:

    with open("column_header.tsv") as fr:
        columns = fr.readline().split()
    
    读取
    数据文件.tsv

    users = spark.read.option("delimiter", "\t").csv("data_file.tsv").toDF(*columns)
    
    browsers = spark.read.csv("called browser_type.tsv") \
        .toDF("browser_type", "browser_name")
    
    读取称为浏览器类型tsv的

    users = spark.read.option("delimiter", "\t").csv("data_file.tsv").toDF(*columns)
    
    browsers = spark.read.csv("called browser_type.tsv") \
        .toDF("browser_type", "browser_name")
    
    加入:


    这里是awk,以防万一。请注意文件顺序:

    $ awk 'NR==FNR{ a[$1]=$2;next }{ $NF=($NF in a?a[$NF]:$NF) }1' file3 file1 file2
    
    输出:

    first_name last_name address zip_code browser_type
    John Doe 111 New Drive, Ca 11111 Chrome
    Mary Doe 133 Creator Blvd, NY 44499 Safari
    Mike Coder 13 Jumping Street UT 66499 FireFox
    
    解释:

    NR==FNR {                            # process browser_type file
        a[$1]=$2                         # remember remember the second of ...
        next }                           # skip to the next record
    {                                    # process the other files
        $NF=( $NF in a ? a[$NF] : $NF) } # replace last field with browser from a
    1                                    # implicit print
    

    文件合并和操作在spark中完全可行。在合并行之前,您只需要提出自己的逻辑来操作行。