我想获取一个CSV文件并转换为单个JSON,我已经编写并验证了代码。我有一个54 GB的CSV文件,我想将此单个文件转换并导出为单个JSON,我想在Spark中获取此数据,它将使用SparkSQL -- compute this once, instead of for each row
Declare @now_minus_6mos as date = DATEADD(month, -6, GETDATE());
print @now_minus_6mos;
select
'item' AS type, soitem.productnum as 'SKU',
(soitem.unitprice / 1 ) as unitPrice, -- I do not have UOM, so simplify to be one
-- I do not have Customer replace(customer.name, "#", "") AS priceList,
(soitem.dateLastFulfillment) -- remove the max, since we are getting only the last one
from
(Select * From
(Select
productnum
,unitprice
,dateLastFulfillment
,Row_Number() Over(Partition By productnum Order By dateLastFulfillment DESC) as dlfRow
From soitem
--move where filters here to reduce number of rows returned
Where
soitem.dateLastFulfillment > @now_minus_6mos
and soitem.unitprice > 0
) aa
Where dlfRow = 1
) soitem
内置函数来设计JSON。
我仅在一台机器上在Eclipse IDE中运行Spark作业。机器配置具有16 GB RAM,i5处理器,600 GB HDD。
现在,当我尝试运行spark程序时,它抛出collect_set(struct
并且堆大小不足错误。我试图将java.lang.OutOfMemory
的值spark.sql.shuffle.partitions
增加到2000
,但是由于我提到的相同的错误,在加载后和转换期间作业仍然失败。
我不想将单个CSV拆分为多个部分,我想处理该单个CSV,如何实现呢?需要帮忙。谢谢。
火花配置:
20000
答案 0 :(得分:0)
我这边的观察很少,
在驱动程序末尾收集数据时,它需要有足够的内存来保存完整的json输出。 12g不足以容纳该IMO。
200g执行程序内存,然后分配多少?执行者也需要足够的内存来处理/转换大量数据。如果为驱动程序分配了12g内存,并且如果您总共分配了16g内存,那么考虑到系统上正在运行的其他应用程序,执行程序的可用内存仅为1-2gb。有可能获得OOM。我建议您查找驱动程序或执行程序是否缺少内存
最重要的是,Spark旨在在多台计算机上并行处理数据以获取最大吞吐量。如果您想在单机/单执行器/单核等上进行处理,那么您根本就不会利用Spark。
不确定为什么要将其作为一个文件处理,但是我建议再次重新访问您的计划,并以Spark能够利用其好处的方式对其进行处理。希望这会有所帮助。