Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.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
Python 在hadoop中加载大型日语文件_Python_Apache Spark_Hive_Pyspark_Hdfs - Fatal编程技术网

Python 在hadoop中加载大型日语文件

Python 在hadoop中加载大型日语文件,python,apache-spark,hive,pyspark,hdfs,Python,Apache Spark,Hive,Pyspark,Hdfs,我在HDFS上有一个巨大的文件,它是我数据库的摘录。e、 g: 1||||||1||||||||||||||0002||01||1999-06-01 16:18:38||||2999-12-31 00:00:00||||||||||||||||||||||||||||||||||||||||||||||||||||||||2||||0||W.ISHIHARA||||1999-06-01 16:18:38|||||||||||||||||||||||||||||||||||||||||||||||

我在HDFS上有一个巨大的文件,它是我数据库的摘录。e、 g:

1||||||1||||||||||||||0002||01||1999-06-01 16:18:38||||2999-12-31 00:00:00||||||||||||||||||||||||||||||||||||||||||||||||||||||||2||||0||W.ISHIHARA||||1999-06-01 16:18:38||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||19155||||||||||||||1||1||NBV||||||||||||||U||||||||N||||||||||||||||||||||
1||||||8||2000-08-25 00:00:00||||||||3||||0001||01||1999-06-01 16:26:16||||1999-06-01 17:57:10||||||||||300||||||PH||400||Yes||PH||0255097�`||400||||1||103520||||||1||4||10||||20||||||||||2||||0||S.OSARI||1961-10-05 00:00:00||1999-06-01 16:26:16||�o��������������||�o��������������||1||||����||||1||1994-01-24 00:00:00||2||||||75||1999-08-25 00:00:00||1999-08-25 00:00:00||0||1||||4||||||�l��������������||�o��������������||�l��������������||||�o��������������||NP||||�l��������������||�l��������������||||||5||19055||||||||||1||||8||1||NBV||||||||||||||U||||||||N||||||||||||||||||||||
  • 文件大小:40GB
  • 记录数:~1200000
  • 字段数:112
  • 现场sep:||
  • 行sep:\n
  • 编码:sjis
我想使用pyspark(1.6和python3)在配置单元中加载这个文件。但我的工作一直在失败。 这是我的密码:

toProcessFileDF = sc.binaryFiles("MyFile")\
    .flatMap(lambda x: x[1].split(b'\n'))\
    .map(lambda x: x.decode('sjis'))\
    .filter(lambda x: x.count('|')==sepCnt*2)\
    .map(lambda x: x.split('||'))\
    .toDF(schema=tableSchema) #tableSchema is the schema retrieved from hive
toProcessFileDF.write.saveAsTable(tableName, mode='append')
我收到了几个错误,但其中包括jave143(内存错误)、心跳超时和内核死机。(如果您需要确切的日志错误,请告诉我)


这样做对吗?也许有更聪明或更有效的方法。关于如何执行此操作,您能给我一些建议吗?

日志会很有帮助

binaryFiles
将从HDFS读取此二进制文件作为单个记录,并以键值对的形式返回,其中键是每个文件的路径,值是每个文件的内容

Spark文档中的注意事项:首选小文件,也可以使用大文件,但可能会导致性能下降

如果您使用
textFile

toProcessFileDF = sc.textFile("MyFile")\
                    .map(lambda line: line.split("||"))\
....
另外,一个选项是在读取初始文本文件(例如sc.textFile(path,200000))时指定更多的分区,而不是在读取后重新分区


另一件重要的事情是确保您的输入文件是可拆分的(一些压缩选项使其不可拆分,在这种情况下,Spark可能必须在一台机器上读取它,从而导致OOM)。

我发现databrick csv阅读器非常有用

toProcessFileDF_raw = sqlContext.read.format('com.databricks.spark.csv')\
                                        .options(header='false',
                                                 inferschema='false',
                                                 charset='shift-jis',
                                                 delimiter='\t')\
                                        .load(toProcessFile)
不幸的是,我只能使用分隔符选项拆分一个字符。因此,我的解决方案是使用tab进行拆分,因为我确信我的文件中没有任何内容。然后我可以在我的线路上应用拆分


这并不完美,但至少我有正确的编码,我没有把所有的东西都放在内存中

您是否尝试简单地在文件上创建一个外部配置单元表?我不认为Spark会对一个小集群上内存中40 GB的数据感到太高兴2。我的体系结构中的配置单元对文件所在的文件夹没有读取权限。配置单元外部表不支持2字符字段sep。但我的群集不是很小。那么,移动或复制HDFS文件?我可能是错的,但是
字段以“| |”结尾
似乎对meThis有效。这肯定是朝着这个方向迈出的一步,但考虑到这个问题,你会像
sc.textFile(path,use_unicode=False).map(lambda s:s.decode(“sjis”)
sc.textFile接收UTF-8中的文本。。。因此,以后不可能解码。utf-8中无法读取的字符已损坏。@zero323仅供参考,这个主意不错,但“使用unicode”并不像您想象的那样有效。它带来了utf8解码的文件,而不是utf8编码的。。。这会在日语字符中产生错误。