Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PySpark脚本对1GB文件成功,对20GB文件失败-java.lang.NullPointerException_Java_Apache Spark_Group By_Apache Spark Sql_Bigdata - Fatal编程技术网

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

PySpark脚本对1GB文件成功,对20GB文件失败-java.lang.NullPointerException,java,apache-spark,group-by,apache-spark-sql,bigdata,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

我使用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行开始)

我的脚本:

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
如果需要更多信息,请告诉我,我会提供的


谢谢

我想错误的原因是一些“坏”记录

通过向CSV解析选项中添加
mode='dropmorformed'

问题已解决,脚本已顺利完成。

请尝试在选项
dateFormat='yyyyMMddHHmmss'
中设置日期格式。顺便说一句,您可以在使用2.0+时使用spark内置CSV解析器。在选项中设置日期格式是什么意思?如何准确地使用它?斯帕克对我来说很新鲜。什么是spark内置CSV解析器?这不是我目前使用的'com.databricks.spark.csv'吗?我的cmd是
spark submit--packages com.databricks:spark-csv_2.11:1.5.0./script.py
Usage
options(header='true',inferschema='true',delimiter='\t',dateFormat='yyyyMMddHHmmss')。
这不是我当前使用的'com.databricks.spark.csv'吗?这是相同的代码。但是,它从2.0版转向了spark sql。最后,代码应该是
format('csv')。选项(header='true',inferschema='true',delimiter='\t',dateFormat='yyyyMMddHHmmss')
,无需添加
——packages com.databricks:spark-csv_2.11:1.5.0
在命令中,它可以是
spark submit./script.py
。很高兴知道,我会尝试一下。关于
dateFormat
,为什么重要?我当前没有使用脚本中的时间列