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.