Samobójstwa

Rocznie ponad 5000 ludzi ginie w Polsce w wyniku samobójstw. To zdecydowanie więcej niż w wypadkach drogowych (2909 osób w 2019 roku)!

Najwięcej skutecznych prób samobójczych jest w poniedziałek, a najmniej w sobotę. Weekendowe próby samobójcze są mniej tragiczne niż pozostałe.

Największe ryzyko śmierci samobójczej mają osoby w wieku 60-65 lat.

Największym zaskoczeniem dla mnie był fakt, że więcej osób ginie w wyniku samobójstw niż w wypadkach drogowych. Temat śmierci na drodze jest dość często poruszany w mediach przy okazji wakacji i świąt. Ogólnie mówiąc, każdy wie, że polskie drogi nie należą do najbezpieczniejszych. Natomiast samobójstwa są tematem tabu niezbyt często poruszanym publicznie i jestem przekonany, że niewielu zdaje sobie sprawę jak poważny jest to problem.

Zabici w wypadkach drogowych oraz samobójstwa, rok 2019

Okazuje się, że Policja publikuje ciekawe statystyki na temat samobójstw. Są dostępne roczne zestawienia z podziałem na wiele zmiennych takich jak wykształcenie wiek czy okoliczności próby samobójczej. Co ciekawe, oprócz samych samobójstw są zliczane także próby samobójcze. Pozwala to spojrzeć na problem szerzej zamiast skupiać się jedynie na fatalnych skutkach.

Procent samobójstw przypadający na dany dzień tygodnia

Najwięcej prób samobójczych (16% wszystkich przypadków) ma miejsce w poniedziałki. Weekend, a zwłaszcza soboty, są bezpieczniejsze. W 2019 niemal co druga próba samobójcza w poniedziałek zakończyła się tragicznie.

Procent prób samobójczych zakończonych śmiercią wg dni tygodnia

Ciekawe jest rozbicie danych na grupy wiekowy. Okazuje się, że problem samobójstw dotyczy dorosłych Polaków w każdym wieku. W 2019 na każde 100 tys. ludności było ok 15-18 samobójstw. Natomiast młodsi obywatele, szczególnie ci mający 19-29 lat popełniają najwięcej prób samobójczych – 49 na 100 tys.

Próby samobójcze oraz samobójstwa wg wieku na 100 tys. osób, rok 2019

Od lat mówi się o fatalnej sytuacji w służbie zdrowia, a pandemia COVID-19 i towarzyszący jej kryzys gospodarczy dodatkowo pogorszają sytuację. Pocieszający jest fakt, że na przestrzeni ostatnich lat liczba samobójstw spadała. Co prawda w 2019 znowu wzrosła, a rok 2020, wraz ze wszystkimi problemami, jest zupełnie niepodobny do wcześniejszych, więc trudno wyrokować jakie statystyki zobaczymy za kilka miesięcy.

Źródła:

https://www.statystyka.policja.pl/st/wybrane-statystyki/zamachy-samobojcze

https://statystyka.policja.pl/download/20/344365/Wypadkidrogowe2019.pdf

http://demografia.stat.gov.pl/ – stan ludności wg roku urodzenia

Timestamps in Parquet on Hadoop

One of main advantages of open source Hadoop environment is that we are free to choose different tools that will make up our Big Data platform. No matter what kind of software distribution you decide to use, most of the times you can freely customise it by adding extra frameworks or upgrading versions on your own. The free choice of products gives great flexibility but also can cause a lot of difficulties when orchestrating different parts together. In this post I’d like to share some of the problems with handling timestamp on Parquet files.
Timestamp is commonly used and supported data type. You can find it in most of the frameworks but it turns out that tools can store and interpret it quite differently which will end up in wrong results or even hours spent on debugging your data workflow.

Timestamp in Hive

Hive supports Timestamp since version 0.8. They are interpreted as timestamps in local time zone (so the actual value is stored in parquet file as UTC) [4]. When timestamps are read from the file server’s time zone is applied on the value to give local timestamp. Of course, such behaviour depends on the file format. Text file format don’t imply any conversions to UTC.

Timestamp in Impala

In Impala timestamps are saved in local time zones, which is different than in Hive. Because historically Impala-Hive operability was very important, there are some workarounds to make coexistence of these two frameworks possible. The following impalad start-up parameter will add proper handling for timestamps in Hive-generated parquet file:
convert_legacy_hive_parquet_utc_timestamps=true (default false) [2]
It is worth mentioning that parquet file metadata is used to determine if the file was created in Hive or not. parquet-tools meta <file> command is helpful to see the creator of the file.

There is also Hive option to allow reading Impala’s files. Parameter hive.parquet.timestamp.skip.conversion is by default set to true and it means that parquet files created in Impala won’t have time zone applied, because the timestamps are already saved in local time zone.

Timestamp in Spark

Spark-Hive interoperability is fine. Every time we read timestamp column we have correct timestamp. The problem begins when we read in Spark tables created in Impala. In such case Spark apply server timezone to file which already have local timestamps and as a result we get different timestamps.
The main problem is that Spark (up to the newest version 2.2.0) doesn’t provide any special handling for Impala parquet files. So every time we have any scripts in Impala that process data later used in Spark we need to stay aware of the problems. Keep in mind that there are various Impala and Hive parameters that can influence the timestamp adjustments.

Sqoop

Even more problems if we add Sqoop to the workflow. Sqoop stores timestamp in Parquet as INT64 which makes the imported parquet file incompatible with Hive and Impala. These two tools will return errors when reading sqoop’s parquet files with timestamps. The funny thing is that Spark will read such file correctly without problems.

Timestamp in Parquet

Parquet is one of the most popular columnar format the is supported by most of the processing engines available on Hadoop. Its data types include only BOOLEAN, INT32, INT64, INT96, FLOAT, DOUBLE and BYTE_ARRAY[1]. Timestamps is defined as a logical type (TIMESTAMP_MILLIS, TIMESTAMP_MICROS) [5], but since Impala stores the timestamp up to nanosecond precision, it was decided to use INT96. Other frameworks followed Impala to use INT96, but time zone interpretation compatibility was somehow missed.

In SQL database

So, how is it done in SQL database?
In Oracle for example we have TIMESTAMP for storing timestamp without timezone information, but with defined precision, TIMESTAMP WITH TIME ZONE and TIMESTAMP WITH LOCAL TIME ZONE (where timestamp are stored in DB time zone and converted to session time zone when returning to the client) [7].
In Postgres we have two options too: TIMESTAMP (without time zone information) and TIMESTAMP WITH TIME ZONE (which is stored as UTC and converted to local time zone after reading) [8].
It could be helpful to have such choice on Hadoop.

Conclusion

Because Hadoop is open ecosystem with multiple independently-developed components sometimes it’s possible to find areas where there are some incompatibilities between components. Handling timestamp is a good example of such problem. Although there are some workaround to this known issue, some cases are still quite hard to detect and overcome. It is also a good example of typical difficulties with complex and open environment when compared to product designed and developed by single vendor.

References

 

Working day vs. weekend page views

Two months ago Stack Overflow published interesting blog post on programming languages and weather people are more likely to ask question during week or on weekend. It gives some
overview of how widely languages are spread in business (week) and hobby (weekend) projects.
From their analysis we can see that for example T-SQL, PowerShell and Oracle are used
during week whereas Huskell, assembly and C during weekend.

On Wikipedia…

I was interested in checking the same using Wikipedia page views data. Of course with Wikipedia it will be a bit differently. When someone learns programming language
they don’t usually read about it on Wikipedia, but rather find tutorial or look for answers on Stack Overflow. In some cases however Wikipedia can be main source of knowledge, especially when someone looks for theoretical aspects of programming or technology.
I checked several articles from different categories: databases, programming and data science. I checked page views of English Wikipedia since September 2016. For each article I computed weekend to week ratio (average page views during weekend / average page views during working days).

Database

Database category shows something interesting. There is a difference between theoretical concepts, for example Slowly changing dimension article is more work-related than normalisation and normal form definitions. On the other end of the scale there is Blockchain that is the most ‘weekend’ page in this section.

Data science

In data science section, there is interesting observation. Deep learning itself and
various modern frameworks usually related to deep learning/neural networks are
much more weekend articles than older machine learning algorithms.

Programming

As mentioned above, reading about programming language on Wikipedia is not really
sign that the language is used in projects. More likely people will check some detail about
it when they hear that name for the first time. Nevertheless there are some interesting facts.
As in Stack Overflow report, Huskell seems to attract more people during weekends.
On the other hand, it’s has similar ratio as Java so probably this is not the best
indicator about how popular in business is given language.
Design patterns are more work-related than some theoretical articles related to
functional programming or internals (garbage collection or stack buffer overflow).

Surprisingly, Scala was seems to be more often read during working days than other
languages that I checked.

Jeden procent

Co roku rozliczając się z Urzędem Skarbowym możemy przekazać 1% podatku PIT na wskazaną przez nas organizację pożytku publicznego. W zeszłym roku darowizny z tego tytuły wyniosły ponad 600 mln zł. Ta kwota z roku na rok jest coraz wyższa, po części z tego, że rośnie kwota odprowadzanych podatków ale także wygląda na to, że coraz więcej osób decyduje się wesprzeć organizacje. W ostatnim roku (2015) wszystkie darowizny stanowiły 0.74% wartości podatku PIT, a jeszcze pięć late temu 0.64%.
Darowizny z 1% jako procent PIT

Najwięksi gracze

Ciekawe jest to, że od lat lwią część wszystkich darowizn otrzymuje jedna organizacja. Fundacja Dzieciom “Zdążyć z Pomocą” jest absolutnym liderem i w 2015 roku dostała aż 23% całej puli (144 mln zł).
Wszystkich organizacji, które dostają darowizny z tytułu 1% było w 2015 roku ponad 8 tysięcy, choć tak naprawdę dużych beneficjentów jest niewiele. Okazuje się, że 28 największych otrzymuje ponad połowę wszystkich darowizn. W ostatnich latach duże organizacje umacniały swoją pozycję i zwiększały swój udział, choć w 2014/2015 roku ten proces się zatrzymał.
Udział największych beneficjentów 1%

Spektakularne zmiany

Porównując rok 2015 z poprzednim okresem można odkryć kilka organizacji, które zanotowały spory wzrost. Stowarzyszenie “Wigilia dla Samotnych i Bezdomnych” zebrało ostatnio aż 31 razy więcej środków niż w roku poprzednim (pół miliona w porównaniu z 16 tys. zł w 2014). Oprócz tego sporym wzrostem może też pochwalić się Fundacja Onkologiczna Nadzieja, która ostatnio zebrała 15 razy więcej (ostatnio 200 tys. w porównaniu z 12 tys zł). I tu rodzi się pytanie, czy zmieniają się tematy, które najbardziej angażują Polaków do pomocy.

Jakie organizacje wspieramy najczęściej?

Czy zmieniają się problemy, które poruszają Polaków najbardziej? Patrząc na nazwę organizacji możemy w pewnym stopniu określić główny zakres jej działaności. Oczywiście taka analiza będzie daleka od doskonałości, bo np. “Wielka Orkiestra Świątecznej Pomocy” nie ma w nazwie “dzieci”, które są przecież głównym beneficjentem działań tej fundacji. Niemniej jednak, jeśli przyjrzymy się słowom kluczowym można zaobserwować kilka ciekawostek.
Głównym tematem, którym angażuje podatników są dzieci. Organizacje, które w nazwie mają wpisane “dzieci” od lat niezmiennie dostają nieco ponad jedną trzecią wszystkich darowizn. Z pozostałych tematów, które często się pojawiają to m.in. niepełnosprawni, hospicja i pomoc zwierzętom. Widać przy tym, że właśnie udział organizacji działających na rzecz niepełnosprawnych w ostatnich latach znacząco urósł. Nieznacznie zwiększyło się zaangażowanie w organizacje związane z nowotworami (słowa rak, onkologia, nowotwór), choć w tym przypadku wzrost był dużo mniejszy.
Słowa kluczowe w nazwa OPP

Linki

Dane pochodzą z Ministerstwa Finansów (udostępnione ze pośrednictwem danepubliczne.gov.pl) [link].
 
 
 
 

Hive – Selecting columns with regular expression

In Hive there is rather an unique feature that allows to select columns by
regular expression instead of using column by names.
It’s very useful when we need to select all columns except one. In most of the SQL databases we would have to specify all columns, but in Hive there is this feature that can save us typing.
Let’s say there is a people table with column name, age, city, country and created_at. To select all columns except created_at we can write:

set hive.support.quoted.identifiers=none;
select
    `(created_at)?+.+`
from people
limit 10;

This is equivalent to:

select
    name, age, city, county
from people
limit 10;

Please note that in Hive 0.13 or later you have to set hive.support.quoted.identifier to none.
I have never seen such functionality in others SQL databases.

References

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Select

Spark SQL

This is one of the Hive-specific features that are not available in Spark SQL.

Ekonomiczne losy absolwentów

Parę tygodni temu Ministerstwo Nauki i Szkolnictwa Wyższego udostępniło ciekawe dane. Na stronie absolwenci.nauka.gov.pl możemy sprawdzić jak wiedzie się absolwentom poszczególnych kierunków i uczelni. Dane mogą być niezwykle pomocne dla osób planujących studia i w odróżnieniu od pojawiających się tu i ówdzie listach “najbardziej obleganych kierunków” tutaj znajdziemy faktyczne zarobki absolwentów.
Raporty są dość szczegółowe. Najdziemy informacje na temat liczby absolwentów kończących dany kierunek, oraz jaka część z nich występuje w rejestrach ZUS-u (czyli opłaca bądź opłacała składki). Najciekawszymi danymi są oczywiście te dotyczące zarobków. Oprócz średniego wynagrodzenia możemy też znaleźć rozkład wynagrodzenia i medianę. Póki co wyniki są dostępne dla jednego rocznika, ale struktura raportów sugeruje, że podsumowania będą uaktualniane w kolejnych latach i będzie można śledzić losy absolwentów także w dłuższej perspektywie czasowej.

Brakujący element

Dane są ciekawe i pomocne ale strasznie rozczarował mnie sposób ich prezentacji. W zasadzie jedyne co można zrobić na portalu ministerstwa to wyszukać kierunek albo uczelnie i przeczytać PDF-a, w którym zawarte są wskaźniki podsumowujące absolwentów. Nie uda nam się łatwo porównać kierunków ani uczelni. Nie dowiemy się też w prosty sposób w jakiej dziedzinie zarabia się najwięcej a gdzie czycha największe bezrobocie.

Wizualizacja

Postanowiłem ściągnąć wszystkie raporty i po napisaniu prostego parsera zrobiłem interaktywną wizualizację w d3js, w której możemy wyszukiwać kierunki i uczelnie oraz podglądać oryginalne raporty na stronach ministerstwa.
Ile zarabiają absolwenci
Nie zaskakuje to, że studenci studiów zaocznych zazwyczaj zarabiają w pierwszym roku po studiach więcej niż studenci dzienni. Ma to zapewne związek z tym, że płatna nauka w weekend często idzie w parze z pracą zarobkową tak więc po studiach te osoby mają już doświadczenie zawodowe i co za tym idzie wyższe zarobki.

Najlepsze kierunki

Nie jest zaskoczeniem, że informatyka jest tym kierunkiem, który zazwyczaj gwarantuje dobre zarobki. Jest jednak wiele rozbieżności pomiędzy poszczególnymi uczelniami. W pewnym stopniu może to zależeć od poziomu nauczania, ale istotne jest również miejsce zamieszkania absolwentów. Raporty ministerstwa próbują to pokazać i oprócz średniego wynagrodzenia pokazują zarobki w odniesieniu do przeciętnego wynagrodzenia w powiatach zamieszkania absolwentów.

Zaskoczenie

Niektóre kierunki mogą być zaskoczeniem. Pierwszym takim przypadkiem jest leśnictwio, po którym zarobki są porównywalne z informatyką, choć oczywiście takich kierunków jest niewiele. Drugim nieoczywistym przypadkiem górnictwo i geologia w trybie zaocznym. Po tym kierunku również dobrze się zarabia, ale możliwe, że jest to związane z doszkalaniem się osób pracujących już w górnictwie. Absolwenci studiów dziennych tego kierunku zarabiają bowiem przeciętnie.

Hadoop user name

Some time ago I was looking for this option:
Environmental variable HADOOP_USER_NAME lets you specify the username that will be used when connecting to Hadoop, for example to create new HDFS files or accessing existing data.
Let’s have a look at the short example:

[root@sandbox ~]# echo "New file" | hdfs dfs -put - /tmp/file_as_root
[root@sandbox ~]# export HADOOP_USER_NAME=hdfs
[root@sandbox ~]# echo "New file" | hdfs dfs -put - /tmp/file_as_hdfs
[root@sandbox ~]# hdfs dfs -ls /tmp/file_*
-rw-r--r--   3 hdfs hdfs        154 2016-05-21 08:20 /tmp/file_as_hdfs
-rw-r--r--   3 root hdfs        154 2016-05-21 08:19 /tmp/file_as_root

So the second (file_as_hdfs) is owned by hdfs user because that was the value of HADOOP_USER_NAME variable.
Of course it works only on Hadoop cluster without Kerberos, but still it’s very useful on test environment or on VM. You can act as many users without executing sudo commands all the time.

Hive gotchas – Order By

There is this one feature in Hive that I really hate: ORDER BY col_index.
Historically order by clause accepted only column aliases, like in the simple example below:

select id, name from people order by name;
+------------+--------------+--+
| people.id  | people.name  |
+------------+--------------+--+
| 5          | Jimmy        |
| 2          | John         |
| 1          | Kate         |
| 4          | Mike         |
| 3          | Sam          |
+------------+--------------+--+

In other relational databases it is possible to give not only column alias but also column index, It much simpler to say “column 3” rather than typing whole name or alias. This option was not supported in Hive at the beginning, but community noticed that and a ticket was created.
Since Hive 0.11.0 it is possible to order the result by column index as well, however there is a gotcha here. There is a property that enables this new option: hive.groupby.orderby.position.alias must be set to ‘true’. The problem is that by default it is set to ‘false’ and in that case you can still use numbers in order by clause, but they are interpreted literally (as numbers) not as column index, which is rather strange.
So for example in the any modern Hive version where you do something like that:

select id, name from people order by 2;
+------------+--------------+--+
| people.id  | people.name  |
+------------+--------------+--+
| 1          | Kate         |
| 2          | John         |
| 3          | Sam          |
| 4          | Mike         |
| 5          | Jimmy        |
+------------+--------------+--+

As you can see by default it was interpreted as “value 2”, not the “column number 2”. After enabling the option you can change how the order by works:

set hive.groupby.orderby.position.alias=true;
select id, name from people order by 2;

+-----+--------+--+
| id  |  name  |
+-----+--------+--+
| 5   | Jimmy  |
| 2   | John   |
| 1   | Kate   |
| 4   | Mike   |
| 3   | Sam    |
+-----+--------+--+

So this time after enabling option we can use column number to sort by name. The problem is that whenever you work in Hive you have to think if the hive.groupby.orderby.position.alias was enabled in current session or not. This makes rather impractical and limits the usage of this syntactical sugar. Moreover I cannot really see any use case for using order by <value>

References

Hive Order By – https://cwiki.apache.org/confluence/display/Hive/LanguageManual+SortBy

Hive table properties

It was a surprise for me to find those two properties – very useful when dealing with large amount of files generated in other systems. I couldn’t find it on Hive docs, but you can come across these settings on forums.
skip.header.line.count tells how many lines from the file should be skipped. Useful when you read CSV files and first file contains header with column names. It works with text file (ROW FORMAT DELIMITED FIELDS TERMINATED BY…) and with CSV Serde. There is also complementary settings that allows to skip footer lines: skip.footer.line.count. The problem is however that Spark does’t recognize those properties so be careful when you plan to read the table later via Spark HiveContex.
Speaking about Hive table properties the following setting may also be very useful.
serialization.null.format is another table property which define how NULL values are encoded in the text file. Here is an example of using “null” string as NULL marker:

CREATE TABLE table_null(
     s1 STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
TBLPROPERTIES('serialization.null.format'='null');

So whenever field will contain string “null” it will be interpreted as NULL value.

Field separator escape

One more useful property that can be used when dealing with text files is delim.escape. This property allows setting custom character that will be used to escpe separator in column values:

CREATE TABLE table_escape(
    s1 STRING,
    s2 STRING
) ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
TBLPROPERTIES('escape.delim'='\\');

(We use backslash for escape delimiter, but it has to be escaped as in Java)
In such case the following data file:

aaaa,bbbb
aaa\,bbb,cc

will be interpreated as:

0: jdbc:hive2://localhost:10000> select * from table_escape
0: jdbc:hive2://localhost:10000> ;
+------------------+------------------+--+
| table_escape.s1  | table_escape.s2  |
+------------------+------------------+--+
| aaaa             | bbbb             |
| aaa,bbb          | cc               |
+------------------+------------------+--+

Custom line breaks

There is also syntax that allows to split records with some character other than new line:

CREATE TABLE table_lines(
    s1 STRING,
    s2 STRING
) ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '|';

However it is currently not supported (I tried on Hive 1.2.1):

Error: Error while compiling statement: FAILED: SemanticException 5:20 LINES TERMINATED BY only supports newline '\n' right now. Error encountered near token ''|'' (state=42000,code=40000)

Binary formats

Generally speaking, text files should be rather avoided on Hadoop, because binary columnar format usually give better performance. Nevertheless CSV or other plain text files can be found quite often as an input from external systems. In such cases it good to have different formatting options and easily start using Hive in existing ecosystem without too much hassle.
 
 

Apache Drill

Last week I spent some time playing with Apache Drill and I really liked it. It seems that tool had some significant development last year and the coverage of SQL functionality is wide enough to migrate from Hive (at least in many typical cases).
I had a chance to do a short introduction presentation which is available here:
Introduction to Apache Drill
It seems there are still some issues that may block introducing Drill into existing production environments.
First of all it doesn’t support YARN, so it may be a challenge to deploy it alongside existing Hadoop nodes. Missing Kerberos support may also be an issue for some mature production clusters. There are however tickets already created for both of the features, so maybe in the next versions we will enjoy those improvements.