PySpark脚本成功获得1GB文件,20GB文件失败 - java.lang.NullPointerException

时间:2017-01-20 09:48:54

标签: java apache-spark group-by apache-spark-sql bigdata

我使用PySpark和spark-submit来读取和操作带有标题的CSV文件。

第一个操作与截断某些列,转换为整数类型等有关。

主要操作是使用groupBy来计算列的统计度量,基于另一列值。

当我在 1GB文件上运行我的脚本时,它完美无缺! 问题是,当在 20GB文件上运行时,由于groupBy中的错误,我无法理解它失败。

两个文件具有相同的格式和完全相同的列,例如:

TRANSACTION_URL    START_TIME        END_TIME           SIZE    FLAG  COL6 COL7 ...
www.google.com     20170113093210    20170113093210     150      1    ...  ...
www.cnet.com       20170113114510    20170113093210     150      2    ...  ... 

只有第一个文件包含X个事务,第二个文件包含更多的内容(20GB记录)。

错误日志:(错误从第32行开始)

pastebin link for error log

我的剧本:

import datetime
from pyspark import SparkContext
from pyspark.sql import SQLContext
from pyspark.sql.types import *
from pyspark.sql.functions import mean, stddev, regexp_replace, col

sc = SparkContext('local[*]')
sc.setLogLevel("ERROR")
sqlContext = SQLContext(sc)

print ('** Script Started: %s **' % str(datetime.datetime.now()))  # Analysis Start Time

print "Loading file... ",
log_df = sqlContext.read.format('csv').\
    options(header='true', inferschema='true', delimiter='\t', dateFormat='yyyyMMddHHmmss').\
    load("hdfs:/user/BGU/logs/01_transactions.log")  # Load data file
print "Done!\nAdjusting data to fit our needs... ",

'''
Manipulate columns to fit our needs:
'''
size_col = 'DOWNSTREAM_SIZE'
flag_col = 'CONGESTION_FLAG'
url_col = 'TRANSACTION_URL'

log_df = log_df.filter(~log_df[url_col].rlike("(SNI.*)")).\
    withColumn(flag_col, regexp_replace(col(flag_col), "(;.*)", "").
               cast(IntegerType()))
log_df = log_df.withColumn(size_col, log_df[size_col].cast(IntegerType()))

print "done!\n\n** %s Statistical Measures **\n" % size_col

'''
Calculations:
    DOWNSTREAM_SIZE statistics:
    In accordance to CONGESTION_FLAG value
'''
log_df.cache().groupBy(flag_col).agg(mean(size_col).alias("Mean"), stddev(size_col).alias("Stddev")).\
    withColumn("Variance", pow(col("Stddev"), 2)).show(3, False)

print ('** Script Ended: %s **' % str(datetime.datetime.now()))  # Analysis End Time

如果需要更多信息,请告诉我,我会提供。

由于

1 个答案:

答案 0 :(得分:0)

错误的原因有些不好'记录,我想。

mode='DROPMALFORMED'添加到CSV解析选项, 问题已解决,脚本完成且没有错误。