【发布时间】:2017-09-18 01:42:16
【问题描述】:
我在 HDFS 上有这个巨大的文件,它是我的数据库的提取。例如:
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
- 记录数:~120 000 000
- 字段数:112
- 字段分隔:||
- 行 sep:\n
- 编码:sjis
我想使用 pyspark(1.6 和 python 3)在 hive 中加载这个文件。但我的工作一直失败。 这是我的代码:
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')
我收到了几个错误,其中包括 jave 143(内存错误)、心跳超时和内核已死。 (如果您需要确切的日志错误,请告诉我)。
这是正确的方法吗?也许有更聪明或更有效的方法。您能告诉我如何执行此操作吗?
【问题讨论】:
-
您是否尝试在文件上简单地创建一个外部配置单元表?我认为 Spark 不会对小型集群上 40 GB 的内存数据感到高兴
-
2 个问题。我的架构中的 Hive 对文件所在的文件夹没有读取权限。 Hive 外部表不支持 2 字符字段 sep。但我的集群并不小。
-
移动或复制 HDFS 文件,然后呢?我可能错了,但
FIELDS TERMINATED BY '||'似乎对我有用
标签: python apache-spark hive pyspark hdfs