Прежде всего, это, вероятно, не очень хорошая идея, потому что вы не получаете никакой дополнительной информации, но вы привязываетесь к фиксированной схеме (то есть вам нужно знать, сколько стран вы ожидаете, и, конечно же, дополнительная страна означает изменение кода)
Сказав это, это проблема SQL, которая показана ниже. Но если вы полагаете, что это не слишком «программное обеспечение» (серьезно, я это слышал !!), то вы можете отсылать первое решение.
Решение 1:
def reshape(t):
out = []
out.append(t[0])
out.append(t[1])
for v in brc.value:
if t[2] == v:
out.append(t[3])
else:
out.append(0)
return (out[0],out[1]),(out[2],out[3],out[4],out[5])
def cntryFilter(t):
if t[2] in brc.value:
return t
else:
pass
def addtup(t1,t2):
j=()
for k,v in enumerate(t1):
j=j+(t1[k]+t2[k],)
return j
def seq(tIntrm,tNext):
return addtup(tIntrm,tNext)
def comb(tP,tF):
return addtup(tP,tF)
countries = ['CA', 'UK', 'US', 'XX']
brc = sc.broadcast(countries)
reshaped = calls.filter(cntryFilter).map(reshape)
pivot = reshaped.aggregateByKey((0,0,0,0),seq,comb,1)
for i in pivot.collect():
print i
Теперь решение 2: Конечно, лучше, поскольку SQL является правильным инструментом для этого
callRow = calls.map(lambda t:
Row(userid=t[0],age=int(t[1]),country=t[2],nbrCalls=t[3]))
callsDF = ssc.createDataFrame(callRow)
callsDF.printSchema()
callsDF.registerTempTable("calls")
res = ssc.sql("select userid,age,max(ca),max(uk),max(us),max(xx)\
from (select userid,age,\
case when country='CA' then nbrCalls else 0 end ca,\
case when country='UK' then nbrCalls else 0 end uk,\
case when country='US' then nbrCalls else 0 end us,\
case when country='XX' then nbrCalls else 0 end xx \
from calls) x \
group by userid,age")
res.show()
данных:
data=[('X01',41,'US',3),('X01',41,'UK',1),('X01',41,'CA',2),('X02',72,'US',4),('X02',72,'UK',6),('X02',72,'CA',7),('X02',72,'XX',8)]
calls = sc.parallelize(data,1)
countries = ['CA', 'UK', 'US', 'XX']
Результат:
Из 1-го решения
(('X02', 72), (7, 6, 4, 8))
(('X01', 41), (2, 1, 3, 0))
Из второго решения:
root |-- age: long (nullable = true)
|-- country: string (nullable = true)
|-- nbrCalls: long (nullable = true)
|-- userid: string (nullable = true)
userid age ca uk us xx
X02 72 7 6 4 8
X01 41 2 1 3 0
Пожалуйста, дайте мне знать, если это работает, или нет:)
Best Ayan
Изрезывание является проблемой форматирования, в то время как комментарии являются шаблонной проблемой.
шаблоны находятся в Окно-> Предпочтения-> Java-> Стиль кода-> Шаблоны Кода . Просмотрите всех их и ищите вещи, которые требуется изменить.
Средство форматирования сложно. Вы находите его под Окно-> Предпочтения-> Java-> Стиль кода-> Средство форматирования . Существуют тонны опций там, но я просто отвечу на Ваш вопрос.
Для конфигурирования его переходят в: окно-> предпочтения-> Java-> стиль кода-> кодирует шаблоны
Также удостоверьтесь, что Вы проверяете "Средство форматирования кода использования" в Java> Редактор> Шаблоны
Eclipse имеет партия из параметров конфигурации. Смотрите в Windows | Предпочтительное диалоговое окно (или Предпочтительное панорамирование Eclipse на OSX).
, Если Вы роете достаточно глубоко - Вы найдете опции под Java | Стиль кода.
The indention is a formatting issue while the comments is a template issue.
The templates are in Window -> Preferences -> Java -> Code Style -> Code Templates. Browse all of them and look for the things you would like to change.
The Formatter is a little bit more complicated. You find it under Window -> Preferences -> Java -> Code Style -> Formatter. There are tons of options there but I'll just answer your question.
* Templates -> Comments -> Methods -> Edit and delete everything
* Formatter -> Edit -> Braces Tab -> Change which situations you want
* Templates -> Code -> Method Body -> Edit and delete everything