Du försöker ladda för mycket data i RAM-minnet . Du bör först minska mängden data som SQL hämtar dig innan den når Spark och optimera den med hjälp av gnistparametrar, till exempel partitioner .
Överväg en eller flera av dessa optimeringar:
- Ange i
SELECT
vilka kolumner du ska visa explicit, bara de du behöver, om möjligt; - (Raw query) Slinga in en
while
cykla tills du kanfetch
rader genom att slinga varje rad. Följande tekniker kan fungera genom att ställa in en konstantn_rows
att läsa i minnet och uppdaterai
indexera varje cykling:
LIMIT i,i+n_rows
BETWEEN i AND i+n_rows
WHILE primaryKey >= i AND primaryKey < i+n_rows
- Använda partitioner . Använd
partitionColumn
,lowerBound
,upperBound
ochnumPartitions
(Referens 1) och (Referens 2) :
partitionColumn
välj kolumnen som ska användas för att bestämma hur data ska delas (till exempel primärnyckeln ).
lowerBound
fastställer minimivärdet av partitionColumn
som kommer att hämtas.
upperBound
fastställer maximalvärdet av partitionColumn
som kommer att hämtas.
numPartitions
betyder hur många parallella anslutningar du vill ställa in för att läsa data genom RDBMS.
Så Spark kommer att hämta dina datauppsättningar med hjälp av rader som du skulle få om du gjorde SELECT * FROM table WHERE partitionColumn BETWEEN lowerBound AND upperBound
.